$NetBSD: patch-ah,v 1.12 2008/01/31 08:40:51 markd Exp $ --- kicker/applets/naughty/NaughtyProcessMonitor.cpp.orig 2005-10-11 04:03:59.000000000 +1300 +++ kicker/applets/naughty/NaughtyProcessMonitor.cpp @@ -20,8 +20,9 @@ /* OpenBSD support by Jean-Yves Burlett */ -#ifdef __OpenBSD__ +#if defined(__OpenBSD__) || defined(__NetBSD__) #include +#include #include #include #include @@ -29,6 +30,11 @@ #include #endif +#ifdef __NetBSD__ +#include +#include +#endif + #include #include #include @@ -67,10 +73,13 @@ class NaughtyProcessMonitorPrivate QTimer * timer_; QMap loadMap_; QMap scoreMap_; -#ifdef __OpenBSD__ +#if defined(__OpenBSD__) || defined(__NetBSD__) QMap cacheLoadMap_; QMap uidMap_; #endif +#ifdef __NetBSD__ + kvm_t *kd; +#endif uint oldLoad_; uint triggerLevel_; @@ -95,11 +104,17 @@ NaughtyProcessMonitor::NaughtyProcessMon d->interval_ = interval * 1000; d->triggerLevel_ = triggerLevel; d->timer_ = new QTimer(this); +#ifdef __NetBSD__ + d->kd = kvm_open(NULL, NULL, NULL, KVM_NO_FILES, "kvm_open"); +#endif connect(d->timer_, SIGNAL(timeout()), this, SLOT(slotTimeout())); } NaughtyProcessMonitor::~NaughtyProcessMonitor() { +#ifdef __NetBSD__ + kvm_close(d->kd); +#endif delete d; } @@ -219,7 +234,7 @@ NaughtyProcessMonitor::canKill(ulong pid // uint d(l[4].toUInt()); return geteuid() == a; -#elif defined(__OpenBSD__) +#elif defined(__OpenBSD__) || defined(__NetBSD__) // simply check if entry exists in the uid map and use it if (!d->uidMap_.contains(pid)) return false ; @@ -234,7 +249,7 @@ NaughtyProcessMonitor::canKill(ulong pid QString NaughtyProcessMonitor::processName(ulong pid) const { -#if defined(__linux__) || defined(__OpenBSD__) +#if defined(__linux__) || defined(__OpenBSD__) || defined(__NetBSD__) #ifdef __linux__ QFile f("/proc/" + QString::number(pid) + "/cmdline"); @@ -283,6 +298,29 @@ NaughtyProcessMonitor::processName(ulong QString unicode(QString::fromLocal8Bit(argv[0])); free (argv) ; +#elif defined(__NetBSD__) + struct kinfo_proc2 *p; + int len; + char **argv; + + p = kvm_getproc2(d->kd, KERN_PROC_PID, pid, + sizeof(struct kinfo_proc2), &len); + if (len < 1) { + return i18n("Unknown") ; + } + + // Now strip 'kdeinit:' prefix. + QString unicode(QString::fromLocal8Bit(p->p_comm)); + + if (unicode == "kdeinit") { + argv = kvm_getargv2(d->kd, p, 100); + while (argv != NULL && (*argv == "kdeinit:")) { + argv++; + } + if (argv != NULL) { + unicode = *argv; + } + } #endif QStringList parts(QStringList::split(' ', unicode)); @@ -350,6 +388,28 @@ NaughtyProcessMonitor::cpuLoad() const d->oldLoad_ = load ; return (forgetThisOne ? 0 : diff); +#elif defined(__NetBSD__) + int mib[2] ; + u_int64_t cp_time[CPUSTATES] ; + size_t size ; + uint load, diff ; + bool forgetThisOne = 0 == d->oldLoad_; + + // fetch CPU time statistics + + mib[0] = CTL_KERN ; + mib[1] = KERN_CP_TIME ; + + size = CPUSTATES * sizeof(cp_time[0]) ; + + if (-1 == sysctl (mib, 2, cp_time, &size, NULL, 0)) + return 0 ; + + load = cp_time[CP_USER] + cp_time[CP_SYS] ; + diff = load - d->oldLoad_ ; + d->oldLoad_ = load ; + + return (forgetThisOne ? 0 : diff); #else return 0; #endif @@ -420,6 +480,30 @@ NaughtyProcessMonitor::pidList() const free (kp) ; return l ; +#elif defined(__NetBSD__) + struct kinfo_proc2 *kp; + int nentries ; + int i ; + QValueList l; + + kp = kvm_getproc2(d->kd, KERN_PROC_ALL, 0, + sizeof(struct kinfo_proc2), &nentries); + + // time statistics and euid data are fetched only for processes in + // the pidList, so, instead of doing one sysctl per process for + // getLoad and canKill calls, simply cache the data we already have. + + d->cacheLoadMap_.clear () ; + d->uidMap_.clear () ; + for (i = 0; i < nentries; i++) { + l << (unsigned long) kp[i].p_pid ; + d->cacheLoadMap_.insert (kp[i].p_pid, + kp[i].p_cpticks) ; + d->uidMap_.insert (kp[i].p_pid, + kp[i].p_uid) ; + } + + return l ; #else QValueList l; return l; @@ -447,7 +531,7 @@ NaughtyProcessMonitor::getLoad(ulong pid load = userTime + sysTime; return true; -#elif defined(__OpenBSD__) +#elif defined(__OpenBSD__) || defined(__NetBSD__) // use cache if (!d->cacheLoadMap_.contains(pid)) return false ; @@ -464,7 +548,7 @@ NaughtyProcessMonitor::getLoad(ulong pid bool NaughtyProcessMonitor::kill(ulong pid) const { -#if defined(__linux__) || defined(__OpenBSD__) +#if defined(__linux__) || defined(__OpenBSD__) || defined(__NetBSD__) return 0 == ::kill(pid, SIGKILL); #else Q_UNUSED( pid );