aboutsummaryrefslogtreecommitdiffstats
path: root/linux
diff options
context:
space:
mode:
authorDaniel Lange <DLange@git.local>2016-04-11 13:01:17 +0200
committerDaniel Lange <DLange@git.local>2016-04-11 13:01:17 +0200
commit8c82a38002ce09db2a0b83dab8b598cf1ab0596c (patch)
tree596b13ab61b4454e347ff476a84c14c2c9dc3441 /linux
parentff9409b1737627857eb47f64f536a3f66b6a09a4 (diff)
downloaddebian_htop-8c82a38002ce09db2a0b83dab8b598cf1ab0596c.tar.gz
debian_htop-8c82a38002ce09db2a0b83dab8b598cf1ab0596c.tar.bz2
debian_htop-8c82a38002ce09db2a0b83dab8b598cf1ab0596c.zip
Imported Upstream version 2.0.1upstream/2.0.1
Diffstat (limited to 'linux')
-rw-r--r--linux/LinuxProcess.c16
-rw-r--r--linux/LinuxProcessList.c53
2 files changed, 37 insertions, 32 deletions
diff --git a/linux/LinuxProcess.c b/linux/LinuxProcess.c
index c6c3112..43b5e38 100644
--- a/linux/LinuxProcess.c
+++ b/linux/LinuxProcess.c
@@ -268,13 +268,20 @@ io_priority = (cpu_nice + 20) / 5. -- From ionice(1) man page
#define LinuxProcess_effectiveIOPriority(p_) (IOPriority_class(p_->ioPriority) == IOPRIO_CLASS_NONE ? IOPriority_tuple(IOPRIO_CLASS_BE, (p_->super.nice + 20) / 5) : p_->ioPriority)
IOPriority LinuxProcess_updateIOPriority(LinuxProcess* this) {
- IOPriority ioprio = syscall(SYS_ioprio_get, IOPRIO_WHO_PROCESS, this->super.pid);
+ IOPriority ioprio = 0;
+// Other OSes masquerading as Linux (NetBSD?) don't have this syscall
+#ifdef SYS_ioprio_get
+ ioprio = syscall(SYS_ioprio_get, IOPRIO_WHO_PROCESS, this->super.pid);
+#endif
this->ioPriority = ioprio;
return ioprio;
}
bool LinuxProcess_setIOPriority(LinuxProcess* this, IOPriority ioprio) {
+// Other OSes masquerading as Linux (NetBSD?) don't have this syscall
+#ifdef SYS_ioprio_set
syscall(SYS_ioprio_set, IOPRIO_WHO_PROCESS, this->super.pid, ioprio);
+#endif
return (LinuxProcess_updateIOPriority(this) == ioprio);
}
@@ -306,7 +313,12 @@ void LinuxProcess_writeField(Process* this, RichString* str, ProcessField field)
case CNCLWB: Process_colorNumber(str, lp->io_cancelled_write_bytes, coloring); return;
case IO_READ_RATE: Process_outputRate(str, buffer, n, lp->io_rate_read_bps, coloring); return;
case IO_WRITE_RATE: Process_outputRate(str, buffer, n, lp->io_rate_write_bps, coloring); return;
- case IO_RATE: Process_outputRate(str, buffer, n, lp->io_rate_read_bps + lp->io_rate_write_bps, coloring); return;
+ case IO_RATE: {
+ double totalRate = (lp->io_rate_read_bps != -1)
+ ? (lp->io_rate_read_bps + lp->io_rate_write_bps)
+ : -1;
+ Process_outputRate(str, buffer, n, totalRate, coloring); return;
+ }
#endif
#ifdef HAVE_OPENVZ
case CTID: snprintf(buffer, n, "%7u ", lp->ctid); break;
diff --git a/linux/LinuxProcessList.c b/linux/LinuxProcessList.c
index 591210e..1b1a0f3 100644
--- a/linux/LinuxProcessList.c
+++ b/linux/LinuxProcessList.c
@@ -292,15 +292,16 @@ static void LinuxProcessList_readIoFile(LinuxProcess* process, const char* dirna
}
break;
case 's':
- if (line[5] == 'r' && strncmp(line+1, "yscr: ", 6) == 0)
+ if (line[5] == 'r' && strncmp(line+1, "yscr: ", 6) == 0) {
process->io_syscr = strtoull(line+7, NULL, 10);
- else if (strncmp(line+1, "yscw: ", 6) == 0)
- sscanf(line, "syscw: %32llu", &process->io_syscw);
+ } else if (strncmp(line+1, "yscw: ", 6) == 0) {
process->io_syscw = strtoull(line+7, NULL, 10);
+ }
break;
case 'c':
- if (strncmp(line+1, "ancelled_write_bytes: ", 22) == 0)
+ if (strncmp(line+1, "ancelled_write_bytes: ", 22) == 0) {
process->io_cancelled_write_bytes = strtoull(line+23, NULL, 10);
+ }
}
}
}
@@ -446,7 +447,7 @@ static void LinuxProcessList_readOomData(LinuxProcess* process, const char* dirn
}
static void setCommand(Process* process, const char* command, int len) {
- if (process->comm && process->commLen <= len) {
+ if (process->comm && process->commLen >= len) {
strncpy(process->comm, command, len + 1);
} else {
free(process->comm);
@@ -584,7 +585,7 @@ static bool LinuxProcessList_recurseProcTree(LinuxProcessList* this, const char*
ProcessList_add(pl, proc);
} else {
- if (settings->updateProcessNames) {
+ if (settings->updateProcessNames && proc->state != 'Z') {
if (! LinuxProcessList_readCmdlineFile(proc, dirname, name)) {
goto errorReadingProcess;
}
@@ -599,11 +600,11 @@ static bool LinuxProcessList_recurseProcTree(LinuxProcessList* this, const char*
if (settings->flags & PROCESS_FLAG_LINUX_OOM)
LinuxProcessList_readOomData(lp, dirname, name);
- if (proc->state == 'Z') {
+ if (proc->state == 'Z' && (proc->basenameOffset == 0)) {
proc->basenameOffset = -1;
setCommand(proc, command, commLen);
} else if (Process_isThread(proc)) {
- if (settings->showThreadNames || Process_isKernelThread(proc) || proc->state == 'Z') {
+ if (settings->showThreadNames || Process_isKernelThread(proc) || (proc->state == 'Z' && proc->basenameOffset == 0)) {
proc->basenameOffset = -1;
setCommand(proc, command, commLen);
} else if (settings->showThreadNames) {
@@ -720,31 +721,23 @@ static inline double LinuxProcessList_scanCPUTime(LinuxProcessList* this) {
unsigned long long int virtalltime = guest + guestnice;
unsigned long long int totaltime = usertime + nicetime + systemalltime + idlealltime + steal + virtalltime;
CPUData* cpuData = &(this->cpus[i]);
- assert (systemtime >= cpuData->systemTime);
- assert (idletime >= cpuData->idleTime);
- assert (totaltime >= cpuData->totalTime);
- assert (systemalltime >= cpuData->systemAllTime);
- assert (idlealltime >= cpuData->idleAllTime);
- assert (ioWait >= cpuData->ioWaitTime);
- assert (irq >= cpuData->irqTime);
- assert (softIrq >= cpuData->softIrqTime);
- assert (steal >= cpuData->stealTime);
- assert (virtalltime >= cpuData->guestTime);
// Since we do a subtraction (usertime - guest) and cputime64_to_clock_t()
// used in /proc/stat rounds down numbers, it can lead to a case where the
// integer overflow.
- cpuData->userPeriod = (usertime > cpuData->userTime) ? usertime - cpuData->userTime : 0;
- cpuData->nicePeriod = (nicetime > cpuData->niceTime) ? nicetime - cpuData->niceTime : 0;
- cpuData->systemPeriod = systemtime - cpuData->systemTime;
- cpuData->systemAllPeriod = systemalltime - cpuData->systemAllTime;
- cpuData->idleAllPeriod = idlealltime - cpuData->idleAllTime;
- cpuData->idlePeriod = idletime - cpuData->idleTime;
- cpuData->ioWaitPeriod = ioWait - cpuData->ioWaitTime;
- cpuData->irqPeriod = irq - cpuData->irqTime;
- cpuData->softIrqPeriod = softIrq - cpuData->softIrqTime;
- cpuData->stealPeriod = steal - cpuData->stealTime;
- cpuData->guestPeriod = virtalltime - cpuData->guestTime;
- cpuData->totalPeriod = totaltime - cpuData->totalTime;
+ #define WRAP_SUBTRACT(a,b) (a > b) ? a - b : 0
+ cpuData->userPeriod = WRAP_SUBTRACT(usertime, cpuData->userTime);
+ cpuData->nicePeriod = WRAP_SUBTRACT(nicetime, cpuData->niceTime);
+ cpuData->systemPeriod = WRAP_SUBTRACT(systemtime, cpuData->systemTime);
+ cpuData->systemAllPeriod = WRAP_SUBTRACT(systemalltime, cpuData->systemAllTime);
+ cpuData->idleAllPeriod = WRAP_SUBTRACT(idlealltime, cpuData->idleAllTime);
+ cpuData->idlePeriod = WRAP_SUBTRACT(idletime, cpuData->idleTime);
+ cpuData->ioWaitPeriod = WRAP_SUBTRACT(ioWait, cpuData->ioWaitTime);
+ cpuData->irqPeriod = WRAP_SUBTRACT(irq, cpuData->irqTime);
+ cpuData->softIrqPeriod = WRAP_SUBTRACT(softIrq, cpuData->softIrqTime);
+ cpuData->stealPeriod = WRAP_SUBTRACT(steal, cpuData->stealTime);
+ cpuData->guestPeriod = WRAP_SUBTRACT(virtalltime, cpuData->guestTime);
+ cpuData->totalPeriod = WRAP_SUBTRACT(totaltime, cpuData->totalTime);
+ #undef WRAP_SUBTRACT
cpuData->userTime = usertime;
cpuData->niceTime = nicetime;
cpuData->systemTime = systemtime;

© 2014-2024 Faster IT GmbH | imprint | privacy policy