diff options
author | Hisham <hisham@gobolinux.org> | 2016-02-29 21:57:03 -0300 |
---|---|---|
committer | Hisham <hisham@gobolinux.org> | 2016-02-29 21:57:03 -0300 |
commit | e77811e99bfbd59fd1108dc2d13bd57e80f7590d (patch) | |
tree | d34caaa143168d5760de5f4614b04ca75f78cf0b /linux | |
parent | 797bcd096181e201dcedd097abc72d0191da4879 (diff) |
any of these values may wrap
Diffstat (limited to 'linux')
-rw-r--r-- | linux/LinuxProcessList.c | 36 |
1 files changed, 14 insertions, 22 deletions
diff --git a/linux/LinuxProcessList.c b/linux/LinuxProcessList.c index 0f132764..1b1a0f33 100644 --- a/linux/LinuxProcessList.c +++ b/linux/LinuxProcessList.c @@ -721,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; |