]> granicus.if.org Git - procps-ng/commitdiff
Fixing negative ETIME field in ps (rhbz#871819, rhbz#433266)
authorJaromir Capik <jcapik@redhat.com>
Wed, 12 Dec 2012 10:56:27 +0000 (11:56 +0100)
committerCraig Small <csmall@enc.com.au>
Thu, 13 Dec 2012 10:34:05 +0000 (21:34 +1100)
ps/output.c

index 1f7e49409da02c0d0e2ca0f1fc5f64fe733eb573..3bc17ba9a62b6f4384f8cafdf81a46a9ba7ffe8d 100644 (file)
@@ -123,7 +123,7 @@ static int sr_ ## NAME (const proc_t* P, const proc_t* Q) { \
 
 #define cook_time(P) (P->utime + P->stime) / Hertz
 
-#define cook_etime(P) seconds_since_boot - (unsigned long)(P->start_time / Hertz)
+#define cook_etime(P) (((unsigned long long)seconds_since_boot >= (P->start_time / Hertz)) ? ((unsigned long long)seconds_since_boot - (P->start_time / Hertz)) : 0)
 
 #define CMP_COOKED_TIME(NAME) \
 static int sr_ ## NAME (const proc_t* P, const proc_t* Q) { \
@@ -465,7 +465,7 @@ static int pr_etime(char *restrict const outbuf, const proc_t *restrict const pp
 
 /* elapsed wall clock time in seconds */
 static int pr_etimes(char *restrict const outbuf, const proc_t *restrict const pp){
-  unsigned t = seconds_since_boot - (unsigned long)(pp->start_time / Hertz);
+  unsigned t = cook_etime(pp);
   return snprintf(outbuf, COLWID, "%u", t);
 }
 
@@ -476,7 +476,7 @@ static int pr_c(char *restrict const outbuf, const proc_t *restrict const pp){
   unsigned long long seconds;      /* seconds of process life */
   total_time = pp->utime + pp->stime;
   if(include_dead_children) total_time += (pp->cutime + pp->cstime);
-  seconds = seconds_since_boot - pp->start_time / Hertz;
+  seconds = cook_etime(pp);
   if(seconds) pcpu = (total_time * 100ULL / Hertz) / seconds;
   if (pcpu > 99U) pcpu = 99U;
   return snprintf(outbuf, COLWID, "%2u", pcpu);
@@ -488,7 +488,7 @@ static int pr_pcpu(char *restrict const outbuf, const proc_t *restrict const pp)
   unsigned long long seconds;      /* seconds of process life */
   total_time = pp->utime + pp->stime;
   if(include_dead_children) total_time += (pp->cutime + pp->cstime);
-  seconds = seconds_since_boot - pp->start_time / Hertz;
+  seconds = cook_etime(pp);
   if(seconds) pcpu = (total_time * 1000ULL / Hertz) / seconds;
   if (pcpu > 999U)
     return snprintf(outbuf, COLWID, "%u", pcpu/10U);
@@ -501,7 +501,7 @@ static int pr_cp(char *restrict const outbuf, const proc_t *restrict const pp){
   unsigned long long seconds;      /* seconds of process life */
   total_time = pp->utime + pp->stime;
   if(include_dead_children) total_time += (pp->cutime + pp->cstime);
-  seconds = seconds_since_boot - pp->start_time / Hertz ;
+  seconds = cook_etime(pp);
   if(seconds) pcpu = (total_time * 1000ULL / Hertz) / seconds;
   if (pcpu > 999U) pcpu = 999U;
   return snprintf(outbuf, COLWID, "%3u", pcpu);