diff --git a/src/builtin_jobs.cpp b/src/builtin_jobs.cpp index 6b0aa84fb..1dd0a16c2 100644 --- a/src/builtin_jobs.cpp +++ b/src/builtin_jobs.cpp @@ -32,13 +32,18 @@ static int cpu_use(const job_t *j) { for (const process_ptr_t &p : j->processes) { struct timeval t; - int jiffies; + unsigned long jiffies; gettimeofday(&t, nullptr); jiffies = proc_get_jiffies(p.get()); double t1 = 1000000.0 * p->last_time.tv_sec + p->last_time.tv_usec; double t2 = 1000000.0 * t.tv_sec + t.tv_usec; + // Check for a race condition that can cause negative CPU usage to be reported (#7066) + if (t2 < t1 || jiffies < p->last_jiffies) { + continue; + } + // std::fwprintf( stderr, L"t1 %f t2 %f p1 %d p2 %d\n", t1, t2, jiffies, p->last_jiffies ); u += (static_cast(jiffies - p->last_jiffies)) / (t2 - t1); }