From 8c82a38002ce09db2a0b83dab8b598cf1ab0596c Mon Sep 17 00:00:00 2001 From: Daniel Lange Date: Mon, 11 Apr 2016 13:01:17 +0200 Subject: Imported Upstream version 2.0.1 --- linux/LinuxProcess.c | 16 +++++++++++++-- linux/LinuxProcessList.c | 53 +++++++++++++++++++++--------------------------- 2 files changed, 37 insertions(+), 32 deletions(-) (limited to 'linux') 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; -- cgit v1.2.3