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);
}
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