pkgsrc-wip/edb-debugger-git/patches/patch-plugins_DebuggerCore_...

195 lines
8.4 KiB
C++

$NetBSD$
--- plugins/DebuggerCore/unix/netbsd/PlatformCommon.cpp.orig 2017-02-19 02:09:05.354823169 +0000
+++ plugins/DebuggerCore/unix/netbsd/PlatformCommon.cpp
@@ -0,0 +1,189 @@
+/*
+Copyright (C) 2015 - 2015 Evan Teran
+ evan.teran@gmail.com
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "PlatformCommon.h"
+#include <QFile>
+#include <QTextStream>
+#include <QRegExp>
+#include <QtDebug>
+#include <sys/wait.h>
+
+namespace DebuggerCorePlugin {
+
+//------------------------------------------------------------------------------
+// Name: resume_code
+// Desc:
+//------------------------------------------------------------------------------
+int resume_code(int status) {
+
+ if(WIFSTOPPED(status) && WSTOPSIG(status) == SIGSTOP) {
+ return 0;
+ }
+
+ if(WIFSIGNALED(status)) {
+ return WTERMSIG(status);
+ }
+
+ if(WIFSTOPPED(status)) {
+ return WSTOPSIG(status);
+ }
+
+ return 0;
+}
+
+//------------------------------------------------------------------------------
+// Name: get_user_stat
+// Desc: gets the contents of /proc/<pid>/stat and returns the number of elements
+// successfully parsed
+//------------------------------------------------------------------------------
+int get_user_stat(const QString &path, struct user_stat *user_stat) {
+ Q_ASSERT(user_stat);
+
+ int r = -1;
+ QFile file(path);
+ if(file.open(QIODevice::ReadOnly)) {
+ QTextStream in(&file);
+ const QString line = in.readLine();
+ if(!line.isNull()) {
+
+#if 1
+ QRegExp regex(QLatin1String(R"(^(-?[0-9]+) \((.+)\) (.) (-?[0-9]+) (-?[0-9]+) (-?[0-9]+) (-?[0-9]+) (-?[0-9]+) ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+) (-?[0-9]+) (-?[0-9]+) (-?[0-9]+) (-?[0-9]+) (-?[0-9]+) (-?[0-9]+) ([0-9]+) ([0-9]+) (-?[0-9]+) ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+) (-?[0-9]+) (-?[0-9]+) ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+) (-?[0-9]+))"));
+ int n = regex.indexIn(line);
+ if(n != -1) {
+ const QStringList &fields = regex.capturedTexts();
+
+ switch(regex.captureCount()) {
+ default:
+ case 44: user_stat->cguest_time = fields[44].toLongLong(); // "%lld"
+ case 43: user_stat->guest_time = fields[43].toULongLong(); // "%llu"
+ case 42: user_stat->delayacct_blkio_ticks = fields[42].toULongLong(); // "%llu"
+ case 41: user_stat->policy = fields[41].toUInt(); // "%u"
+ case 40: user_stat->rt_priority = fields[40].toUInt(); // "%u"
+ case 39: user_stat->processor = fields[39].toInt(); // "%d"
+ case 38: user_stat->exit_signal = fields[38].toInt(); // "%d"
+ case 37: user_stat->cnswap = fields[37].toULongLong(); // "%llu"
+ case 36: user_stat->nswap = fields[36].toULongLong(); // "%llu"
+ case 35: user_stat->wchan = fields[35].toULongLong(); // "%llu"
+ case 34: user_stat->sigcatch = fields[34].toULongLong(); // "%llu"
+ case 33: user_stat->sigignore = fields[33].toULongLong(); // "%llu"
+ case 32: user_stat->blocked = fields[32].toULongLong(); // "%llu"
+ case 31: user_stat->signal = fields[31].toULongLong(); // "%llu"
+ case 30: user_stat->kstkeip = fields[30].toULongLong(); // "%llu"
+ case 29: user_stat->kstkesp = fields[29].toULongLong(); // "%llu"
+ case 28: user_stat->startstack = fields[28].toULongLong(); // "%llu"
+ case 27: user_stat->endcode = fields[27].toULongLong(); // "%llu"
+ case 26: user_stat->startcode = fields[26].toULongLong(); // "%llu"
+ case 25: user_stat->rsslim = fields[25].toULongLong(); // "%llu"
+ case 24: user_stat->rss = fields[24].toLongLong(); // "%lld"
+ case 23: user_stat->vsize = fields[23].toULongLong(); // "%llu"
+ case 22: user_stat->starttime = fields[22].toULongLong(); // "%llu"
+ case 21: user_stat->itrealvalue = fields[21].toLongLong(); // "%lld"
+ case 20: user_stat->num_threads = fields[20].toLongLong(); // "%lld"
+ case 19: user_stat->nice = fields[19].toLongLong(); // "%lld"
+ case 18: user_stat->priority = fields[18].toLongLong(); // "%lld"
+ case 17: user_stat->cstime = fields[17].toLongLong(); // "%lld"
+ case 16: user_stat->cutime = fields[16].toLongLong(); // "%lld"
+ case 15: user_stat->stime = fields[15].toULongLong(); // "%llu"
+ case 14: user_stat->utime = fields[14].toULongLong(); // "%llu"
+ case 13: user_stat->cmajflt = fields[13].toULongLong(); // "%llu"
+ case 12: user_stat->majflt = fields[12].toULongLong(); // "%llu"
+ case 11: user_stat->cminflt = fields[11].toULongLong(); // "%llu"
+ case 10: user_stat->minflt = fields[10].toULongLong(); // "%llu"
+ case 9: user_stat->flags = fields[9].toUInt(); // "%u"
+ case 8: user_stat->tpgid = fields[8].toInt(); // "%d"
+ case 7: user_stat->tty_nr = fields[7].toInt(); // "%d"
+ case 6: user_stat->session = fields[6].toInt(); // "%d"
+ case 5: user_stat->pgrp = fields[5].toInt(); // "%d"
+ case 4: user_stat->ppid = fields[4].toInt(); // "%d"
+ case 3: user_stat->state = fields[3][0].toLatin1(); // "%c"
+ case 2: snprintf(user_stat->comm, sizeof(user_stat->comm), "%s", qPrintable(fields[2]));
+ case 1: user_stat->pid = fields[1].toInt(); // "%d"
+ break;
+ case 0:
+ qDebug() << "Warning: Failed to read any fields from /proc/<pid>/stat";
+ }
+
+ return regex.captureCount();
+ }
+#else
+ char ch;
+ r = sscanf(qPrintable(line), "%d %c%255[0-9a-zA-Z_- #~/\\.]%c %c %d %d %d %d %d %u %llu %llu %llu %llu %llu %llu %lld %lld %lld %lld %lld %lld %llu %llu %lld %llu %llu %llu %llu %llu %llu %llu %llu %llu %llu %llu %llu %llu %d %d %u %u %llu %llu %lld",
+ &user_stat->pid,
+ &ch, // consume the (
+ user_stat->comm,
+ &ch, // consume the )
+ &user_stat->state,
+ &user_stat->ppid,
+ &user_stat->pgrp,
+ &user_stat->session,
+ &user_stat->tty_nr,
+ &user_stat->tpgid,
+ &user_stat->flags,
+ &user_stat->minflt,
+ &user_stat->cminflt,
+ &user_stat->majflt,
+ &user_stat->cmajflt,
+ &user_stat->utime,
+ &user_stat->stime,
+ &user_stat->cutime,
+ &user_stat->cstime,
+ &user_stat->priority,
+ &user_stat->nice,
+ &user_stat->num_threads,
+ &user_stat->itrealvalue,
+ &user_stat->starttime,
+ &user_stat->vsize,
+ &user_stat->rss,
+ &user_stat->rsslim,
+ &user_stat->startcode,
+ &user_stat->endcode,
+ &user_stat->startstack,
+ &user_stat->kstkesp,
+ &user_stat->kstkeip,
+ &user_stat->signal,
+ &user_stat->blocked,
+ &user_stat->sigignore,
+ &user_stat->sigcatch,
+ &user_stat->wchan,
+ &user_stat->nswap,
+ &user_stat->cnswap,
+ &user_stat->exit_signal,
+ &user_stat->processor,
+ &user_stat->rt_priority,
+ &user_stat->policy,
+ &user_stat->delayacct_blkio_ticks,
+ &user_stat->guest_time,
+ &user_stat->cguest_time);
+#endif
+ }
+ file.close();
+ }
+
+ return r;
+}
+
+//------------------------------------------------------------------------------
+// Name: get_user_stat
+// Desc: gets the contents of /proc/<pid>/stat and returns the number of elements
+// successfully parsed
+//------------------------------------------------------------------------------
+int get_user_stat(edb::pid_t pid, struct user_stat *user_stat) {
+ return get_user_stat(QString("/proc/%1/stat").arg(pid), user_stat);
+}
+
+}