diff -upr sysstat-10.1.5.orig/common.h sysstat-10.1.5/common.h --- sysstat-10.1.5.orig/common.h 2013-03-23 17:31:46.000000000 +0100 +++ sysstat-10.1.5/common.h 2016-04-29 12:47:09.285214132 +0200 @@ -106,9 +106,12 @@ * * NB: Define SP_VALUE() to normalize to %; * HZ is 1024 on IA64 and % should be normalized to 100. + * SP_VALUE_100() will not output value bigger than 100; this is needed for some + * corner cases, should be used with care. */ #define S_VALUE(m,n,p) (((double) ((n) - (m))) / (p) * HZ) #define SP_VALUE(m,n,p) (((double) ((n) - (m))) / (p) * 100) +#define SP_VALUE_100(m,n,p) MINIMUM((((double) ((n) - (m))) / (p) * 100),100) /* * Under very special circumstances, STDOUT may become unavailable. diff -upr sysstat-10.1.5.orig/pidstat.c sysstat-10.1.5/pidstat.c --- sysstat-10.1.5.orig/pidstat.c 2013-03-23 17:31:46.000000000 +0100 +++ sysstat-10.1.5/pidstat.c 2016-04-29 13:04:02.672402150 +0200 @@ -152,15 +152,35 @@ void salloc_pid_array(unsigned int len) */ void salloc_pid(unsigned int len) { - int i; + short i; + + for (i = 0; i < 3; i++) { + if ((st_pid_list[i] = (struct pid_stats *) calloc(len, PID_STATS_SIZE)) == NULL) { + perror("calloc"); + exit(4); + } + } +} + +/* + *************************************************************************** + * Reallocate structures for PIDs to read. + *************************************************************************** + */ +void realloc_pid(void) +{ + short i; + unsigned int new_size = 2 * pid_nr; for (i = 0; i < 3; i++) { - if ((st_pid_list[i] = (struct pid_stats *) malloc(PID_STATS_SIZE * len)) == NULL) { - perror("malloc"); + if ((st_pid_list[i] = (struct pid_stats *) realloc(st_pid_list[i], PID_STATS_SIZE * new_size)) == NULL) { + perror("realloc"); exit(4); } - memset(st_pid_list[i], 0, PID_STATS_SIZE * len); + memset(st_pid_list[i] + pid_nr, 0, PID_STATS_SIZE * (new_size - pid_nr)); } + + pid_nr = new_size; } /* @@ -774,23 +794,22 @@ void read_task_stats(int curr, unsigned if ((dir = opendir(filename)) == NULL) return; - while (*index < pid_nr) { + while ((drp = readdir(dir)) != NULL) { + if (!isdigit(drp->d_name[0])) { + continue; + } - while ((drp = readdir(dir)) != NULL) { - if (isdigit(drp->d_name[0])) - break; + pst = st_pid_list[curr] + (*index)++; + if (read_pid_stats(atoi(drp->d_name), pst, &thr_nr, pid)) { + /* Thread no longer exists */ + pst->pid = 0; } - if (drp) { - pst = st_pid_list[curr] + (*index)++; - if (read_pid_stats(atoi(drp->d_name), pst, &thr_nr, pid)) { - /* Thread no longer exists */ - pst->pid = 0; - } + if (*index >= pid_nr) { + realloc_pid(); } - else - break; } + closedir(dir); } @@ -830,36 +849,34 @@ void read_stats(int curr) exit(4); } - while (p < pid_nr) { + /* Get directory entries */ + while ((drp = readdir(dir)) != NULL) { + if (!isdigit(drp->d_name[0])) { + continue; + } + + pst = st_pid_list[curr] + p++; + pid = atoi(drp->d_name); + + if (read_pid_stats(pid, pst, &thr_nr, 0)) { + /* Process has terminated */ + pst->pid = 0; + } else if (DISPLAY_TID(pidflag)) { + /* Read stats for threads in task subdirectory */ + read_task_stats(curr, pid, &p); - /* Get directory entries */ - while ((drp = readdir(dir)) != NULL) { - if (isdigit(drp->d_name[0])) - break; - } - if (drp) { - pst = st_pid_list[curr] + p++; - pid = atoi(drp->d_name); - - if (read_pid_stats(pid, pst, &thr_nr, 0)) { - /* Process has terminated */ - pst->pid = 0; - } - - else if (DISPLAY_TID(pidflag)) { - /* Read stats for threads in task subdirectory */ - read_task_stats(curr, pid, &p); - } - } - else { - for (q = p; q < pid_nr; q++) { - pst = st_pid_list[curr] + q; - pst->pid = 0; - } - break; } + + if (p >= pid_nr) { + realloc_pid(); + } } + for (q = p; q < pid_nr; q++) { + pst = st_pid_list[curr] + q; + pst->pid = 0; + } + /* Close /proc directory */ closedir(dir); } @@ -1174,15 +1191,15 @@ int write_pid_task_all_stats(int prev, i printf(" %7.2f %7.2f %7.2f %7.2f", (pstc->utime - pstc->gtime) < (pstp->utime - pstp->gtime) ? 0.0 : - SP_VALUE(pstp->utime - pstp->gtime, + SP_VALUE_100(pstp->utime - pstp->gtime, pstc->utime - pstc->gtime, itv), - SP_VALUE(pstp->stime, pstc->stime, itv), - SP_VALUE(pstp->gtime, pstc->gtime, itv), + SP_VALUE_100(pstp->stime, pstc->stime, itv), + SP_VALUE_100(pstp->gtime, pstc->gtime, itv), /* User time already includes guest time */ IRIX_MODE_OFF(pidflag) ? - SP_VALUE(pstp->utime + pstp->stime, + SP_VALUE_100(pstp->utime + pstp->stime, pstc->utime + pstc->stime, g_itv) : - SP_VALUE(pstp->utime + pstp->stime, + SP_VALUE_100(pstp->utime + pstp->stime, pstc->utime + pstc->stime, itv)); printf(" %3d", pstc->processor); @@ -1351,15 +1368,15 @@ int write_pid_task_cpu_stats(int prev, i printf(" %7.2f %7.2f %7.2f %7.2f", (pstc->utime - pstc->gtime) < (pstp->utime - pstp->gtime) ? 0.0 : - SP_VALUE(pstp->utime - pstp->gtime, + SP_VALUE_100(pstp->utime - pstp->gtime, pstc->utime - pstc->gtime, itv), - SP_VALUE(pstp->stime, pstc->stime, itv), - SP_VALUE(pstp->gtime, pstc->gtime, itv), + SP_VALUE_100(pstp->stime, pstc->stime, itv), + SP_VALUE_100(pstp->gtime, pstc->gtime, itv), /* User time already includes guest time */ IRIX_MODE_OFF(pidflag) ? - SP_VALUE(pstp->utime + pstp->stime, + SP_VALUE_100(pstp->utime + pstp->stime, pstc->utime + pstc->stime, g_itv) : - SP_VALUE(pstp->utime + pstp->stime, + SP_VALUE_100(pstp->utime + pstp->stime, pstc->utime + pstc->stime, itv)); if (!disp_avg) { diff -upr sysstat-10.1.5.orig/pidstat.h sysstat-10.1.5/pidstat.h --- sysstat-10.1.5.orig/pidstat.h 2013-03-23 17:31:46.000000000 +0100 +++ sysstat-10.1.5/pidstat.h 2016-04-28 18:24:37.700124018 +0200 @@ -13,7 +13,7 @@ #define K_P_CHILD "CHILD" #define K_P_ALL "ALL" -#define NR_PID_PREALLOC 10 +#define NR_PID_PREALLOC 100 #define MAX_COMM_LEN 128 #define MAX_CMDLINE_LEN 128