1
0
mirror of https://github.com/Llewellynvdm/conky.git synced 2024-09-30 05:59:07 +00:00

top.c: fix for unsigned underflow

Yes, I also thought these are monotonic counters. But it seems like they
are not, at least sometimes the value decreases by 1 leading to a very
very high cpu usage percentage being printed.
This commit is contained in:
Phil Sutter 2009-09-15 22:59:37 +02:00
parent 7fa59c6c90
commit fea72bd8f8

View File

@ -167,6 +167,7 @@ static int process_parse_stat(struct process *process)
"%lu %*s %*s %*s %d %*s %*s %*s %u %u", &process->user_time, "%lu %*s %*s %*s %d %*s %*s %*s %u %u", &process->user_time,
&process->kernel_time, &nice_val, &process->vsize, &process->rss); &process->kernel_time, &nice_val, &process->vsize, &process->rss);
if (rc < 5) { if (rc < 5) {
NORM_ERR("scaning data for %s failed, got only %d fields", procname, rc);
return 1; return 1;
} }
/* remove any "kdeinit: " */ /* remove any "kdeinit: " */
@ -219,6 +220,13 @@ static int process_parse_stat(struct process *process)
process->previous_kernel_time = process->kernel_time; process->previous_kernel_time = process->kernel_time;
} }
/* strangely, the values aren't monotonous */
if (process->previous_user_time > process->user_time)
process->previous_user_time = process->user_time;
if (process->previous_kernel_time > process->kernel_time)
process->previous_kernel_time = process->kernel_time;
/* store the difference of the user_time */ /* store the difference of the user_time */
user_time = process->user_time - process->previous_user_time; user_time = process->user_time - process->previous_user_time;
kernel_time = process->kernel_time - process->previous_kernel_time; kernel_time = process->kernel_time - process->previous_kernel_time;