From 86417e415743ab2ba8feaa83ba303039ea10a012 Mon Sep 17 00:00:00 2001 From: "Martin \"eto\" Misuth" Date: Tue, 6 Oct 2015 12:46:37 +0200 Subject: [PATCH 1/5] Unless I move signal definitions into the comment used for header generation, htop fails to compile with: ```text SignalsPanel.c:32:49: error: use of undeclared identifier 'Platform_signals' Panel_set(this, i, (Object*) ListItem_new(Platform_signals[i].name, Platform_signals[i].number)); ^ 1 error generated. *** Error code 1 ``` --- freebsd/Platform.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/freebsd/Platform.c b/freebsd/Platform.c index 0d01b0ca..64e5e95f 100644 --- a/freebsd/Platform.c +++ b/freebsd/Platform.c @@ -31,12 +31,6 @@ in the source distribution for its full text. extern ProcessFieldData Process_fields[]; -}*/ - -ProcessField Platform_defaultFields[] = { PID, USER, PRIORITY, NICE, M_SIZE, M_RESIDENT, STATE, PERCENT_CPU, PERCENT_MEM, TIME, COMM, 0 }; - -int Platform_numberOfFields = LAST_PROCESSFIELD; - static SignalItem Platform_signals[] = { { .name = " 0 Cancel", .number = 0 }, { .name = " 1 SIGHUP", .number = 1 }, @@ -74,6 +68,12 @@ static SignalItem Platform_signals[] = { { .name = "33 SIGLIBRT", .number = 33 }, }; +}*/ + +ProcessField Platform_defaultFields[] = { PID, USER, PRIORITY, NICE, M_SIZE, M_RESIDENT, STATE, PERCENT_CPU, PERCENT_MEM, TIME, COMM, 0 }; + +int Platform_numberOfFields = LAST_PROCESSFIELD; + unsigned int Platform_numberOfSignals = sizeof(Platform_signals)/sizeof(SignalItem); void Platform_setBindings(Htop_Action* keys) { @@ -105,7 +105,7 @@ int Platform_getUptime() { struct timeval bootTime, currTime; int mib[2] = { CTL_KERN, KERN_BOOTTIME }; size_t size = sizeof(bootTime); - + int err = sysctl(mib, 2, &bootTime, &size, NULL, 0); if (err) { return -1; @@ -119,7 +119,7 @@ void Platform_getLoadAverage(double* one, double* five, double* fifteen) { struct loadavg loadAverage; int mib[2] = { CTL_VM, VM_LOADAVG }; size_t size = sizeof(loadAverage); - + int err = sysctl(mib, 2, &loadAverage, &size, NULL, 0); if (err) { *one = 0; From 23798359102a70c662d095722c96229b605175dc Mon Sep 17 00:00:00 2001 From: "Martin \"eto\" Misuth" Date: Tue, 6 Oct 2015 14:04:22 +0200 Subject: [PATCH 2/5] Added platform dependent DEFAULT_SIGNAL define, for now for: FreeBSD Linux Other platforms will have it undefined for now. --- SignalsPanel.c | 2 +- freebsd/Platform.c | 4 ++++ linux/Platform.c | 9 +++++++-- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/SignalsPanel.c b/SignalsPanel.c index 6a3b89de..a088ab24 100644 --- a/SignalsPanel.c +++ b/SignalsPanel.c @@ -31,6 +31,6 @@ Panel* SignalsPanel_new() { for(unsigned int i = 0; i < Platform_numberOfSignals; i++) Panel_set(this, i, (Object*) ListItem_new(Platform_signals[i].name, Platform_signals[i].number)); Panel_setHeader(this, "Send signal:"); - Panel_setSelected(this, 16); // 16th item is SIGTERM + Panel_setSelected(this, DEFAULT_SIGNAL); return this; } diff --git a/freebsd/Platform.c b/freebsd/Platform.c index 64e5e95f..566a6097 100644 --- a/freebsd/Platform.c +++ b/freebsd/Platform.c @@ -31,6 +31,10 @@ in the source distribution for its full text. extern ProcessFieldData Process_fields[]; +#ifndef DEFAULT_SIGNAL +#define DEFAULT_SIGNAL 15 +#endif + static SignalItem Platform_signals[] = { { .name = " 0 Cancel", .number = 0 }, { .name = " 1 SIGHUP", .number = 1 }, diff --git a/linux/Platform.c b/linux/Platform.c index e0f06d6d..92ca64c4 100644 --- a/linux/Platform.c +++ b/linux/Platform.c @@ -32,6 +32,11 @@ in the source distribution for its full text. #include "BatteryMeter.h" #include "LinuxProcess.h" #include "SignalsPanel.h" + +#ifndef DEFAULT_SIGNAL +#define DEFAULT_SIGNAL 16 +#endif + }*/ ProcessField Platform_defaultFields[] = { PID, USER, PRIORITY, NICE, M_SIZE, M_RESIDENT, M_SHARE, STATE, PERCENT_CPU, PERCENT_MEM, TIME, COMM, 0 }; @@ -176,14 +181,14 @@ double Platform_setCPUValues(Meter* this, int cpu) { percent = v[0]+v[1]+v[2]+v[3]+v[4]+v[5]+v[6]; } else { percent = v[0]+v[1]+v[2]+v[3]+v[4]; - } + } } else { v[2] = cpuData->systemAllPeriod / total * 100.0; v[3] = (cpuData->stealPeriod + cpuData->guestPeriod) / total * 100.0; Meter_setItems(this, 4); percent = v[0]+v[1]+v[2]+v[3]; } - percent = MIN(100.0, MAX(0.0, percent)); + percent = MIN(100.0, MAX(0.0, percent)); if (isnan(percent)) percent = 0.0; return percent; } From 3ea7b3473583c15747d36323c1b1db4ee5cdc4e6 Mon Sep 17 00:00:00 2001 From: "Martin \"eto\" Misuth" Date: Tue, 6 Oct 2015 19:39:01 +0200 Subject: [PATCH 3/5] attempt to return to upstream/master --- SignalsPanel.c | 12 ++++++++++-- freebsd/Platform.c | 20 ++++++++------------ 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/SignalsPanel.c b/SignalsPanel.c index a088ab24..9816a848 100644 --- a/SignalsPanel.c +++ b/SignalsPanel.c @@ -14,6 +14,7 @@ in the source distribution for its full text. #include #include +#include #include @@ -28,9 +29,16 @@ typedef struct SignalItem_ { Panel* SignalsPanel_new() { Panel* this = Panel_new(1, 1, 1, 1, true, Class(ListItem), FunctionBar_newEnterEsc("Send ", "Cancel ")); - for(unsigned int i = 0; i < Platform_numberOfSignals; i++) + const int defaultSignal = SIGTERM; + int defaultPosition = 15; + for(unsigned int i = 0; i < Platform_numberOfSignals; i++) { Panel_set(this, i, (Object*) ListItem_new(Platform_signals[i].name, Platform_signals[i].number)); + // signal 15 is not always the 15th signal in the table + if (Platform_signals[i].number == defaultSignal) { + defaultPosition = i; + } + } Panel_setHeader(this, "Send signal:"); - Panel_setSelected(this, DEFAULT_SIGNAL); + Panel_setSelected(this, defaultPosition); return this; } diff --git a/freebsd/Platform.c b/freebsd/Platform.c index 566a6097..b1703291 100644 --- a/freebsd/Platform.c +++ b/freebsd/Platform.c @@ -31,11 +31,13 @@ in the source distribution for its full text. extern ProcessFieldData Process_fields[]; -#ifndef DEFAULT_SIGNAL -#define DEFAULT_SIGNAL 15 -#endif +}*/ -static SignalItem Platform_signals[] = { +ProcessField Platform_defaultFields[] = { PID, USER, PRIORITY, NICE, M_SIZE, M_RESIDENT, STATE, PERCENT_CPU, PERCENT_MEM, TIME, COMM, 0 }; + +int Platform_numberOfFields = LAST_PROCESSFIELD; + +SignalItem Platform_signals[] = { { .name = " 0 Cancel", .number = 0 }, { .name = " 1 SIGHUP", .number = 1 }, { .name = " 2 SIGINT", .number = 2 }, @@ -72,12 +74,6 @@ static SignalItem Platform_signals[] = { { .name = "33 SIGLIBRT", .number = 33 }, }; -}*/ - -ProcessField Platform_defaultFields[] = { PID, USER, PRIORITY, NICE, M_SIZE, M_RESIDENT, STATE, PERCENT_CPU, PERCENT_MEM, TIME, COMM, 0 }; - -int Platform_numberOfFields = LAST_PROCESSFIELD; - unsigned int Platform_numberOfSignals = sizeof(Platform_signals)/sizeof(SignalItem); void Platform_setBindings(Htop_Action* keys) { @@ -109,7 +105,7 @@ int Platform_getUptime() { struct timeval bootTime, currTime; int mib[2] = { CTL_KERN, KERN_BOOTTIME }; size_t size = sizeof(bootTime); - + int err = sysctl(mib, 2, &bootTime, &size, NULL, 0); if (err) { return -1; @@ -123,7 +119,7 @@ void Platform_getLoadAverage(double* one, double* five, double* fifteen) { struct loadavg loadAverage; int mib[2] = { CTL_VM, VM_LOADAVG }; size_t size = sizeof(loadAverage); - + int err = sysctl(mib, 2, &loadAverage, &size, NULL, 0); if (err) { *one = 0; From 23bf564d73befc4c645bc0bb0290bae4569f33c7 Mon Sep 17 00:00:00 2001 From: "Martin \"eto\" Misuth" Date: Tue, 6 Oct 2015 19:50:19 +0200 Subject: [PATCH 4/5] Fixed reparenting issue. PPID should be updated each refresh as any process can get reparented to either PID1 or even any other PID (if there are custom reapers in the system). Similar issue with jails, elevated process can ask kernel to attach itself into any jail at any time, thus JID and jail name can change each refresh cycle. --- freebsd/FreeBSDProcessList.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/freebsd/FreeBSDProcessList.c b/freebsd/FreeBSDProcessList.c index e1954cae..f1b7a191 100644 --- a/freebsd/FreeBSDProcessList.c +++ b/freebsd/FreeBSDProcessList.c @@ -199,6 +199,7 @@ void ProcessList_goThroughEntries(ProcessList* this) { proc->show = ! ((hideKernelThreads && Process_isKernelThread(fp)) || (hideUserlandThreads && Process_isUserlandThread(proc))); + if (!preExisting) { fp->jid = kproc->ki_jid; proc->pid = kproc->ki_pid; @@ -206,7 +207,6 @@ void ProcessList_goThroughEntries(ProcessList* this) { fp->kernel = 1; else fp->kernel = 0; - proc->ppid = kproc->ki_ppid; proc->tpgid = kproc->ki_tpgid; proc->tgid = kproc->ki_pid; proc->session = kproc->ki_sid; @@ -219,12 +219,19 @@ void ProcessList_goThroughEntries(ProcessList* this) { proc->comm = FreeBSDProcessList_readProcessName(fpl->kd, kproc, &proc->basenameOffset); fp->jname = FreeBSDProcessList_readJailName(kproc); } else { + if(fp->jid != kproc->ki_jid) { + fp->jid = kproc->ki_jid; + free(fp->jname); + fp->jname = FreeBSDProcessList_readJailName(kproc); + } if (settings->updateProcessNames) { free(proc->comm); proc->comm = FreeBSDProcessList_readProcessName(fpl->kd, kproc, &proc->basenameOffset); } } + proc->ppid = kproc->ki_ppid; + proc->m_size = kproc->ki_size / pageSizeKb / 1000; proc->m_resident = kproc->ki_rssize; // * pageSizeKb; proc->nlwp = kproc->ki_numthreads; From 93f05b459fda8b490971a28436865c74baafed86 Mon Sep 17 00:00:00 2001 From: "Martin \"eto\" Misuth" Date: Tue, 6 Oct 2015 20:05:55 +0200 Subject: [PATCH 5/5] fixed broken merge, where I forgot to check linux/Platform.c so that it matches upstream --- linux/Platform.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/linux/Platform.c b/linux/Platform.c index 92ca64c4..32f73893 100644 --- a/linux/Platform.c +++ b/linux/Platform.c @@ -32,11 +32,6 @@ in the source distribution for its full text. #include "BatteryMeter.h" #include "LinuxProcess.h" #include "SignalsPanel.h" - -#ifndef DEFAULT_SIGNAL -#define DEFAULT_SIGNAL 16 -#endif - }*/ ProcessField Platform_defaultFields[] = { PID, USER, PRIORITY, NICE, M_SIZE, M_RESIDENT, M_SHARE, STATE, PERCENT_CPU, PERCENT_MEM, TIME, COMM, 0 };