diff options
Diffstat (limited to 'src/lib/pid.c')
-rw-r--r-- | src/lib/pid.c | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/src/lib/pid.c b/src/lib/pid.c index ad6403f65..3cf0df909 100644 --- a/src/lib/pid.c +++ b/src/lib/pid.c | |||
@@ -30,7 +30,7 @@ | |||
30 | #define PIDS_BUFLEN 4096 | 30 | #define PIDS_BUFLEN 4096 |
31 | //Process pids[max_pids]; | 31 | //Process pids[max_pids]; |
32 | Process *pids = NULL; | 32 | Process *pids = NULL; |
33 | int max_pids=32769; | 33 | int max_pids=32769; // recalculated for every read_pid() call |
34 | 34 | ||
35 | // get the memory associated with this pid | 35 | // get the memory associated with this pid |
36 | void pid_getmem(unsigned pid, unsigned *rss, unsigned *shared) { | 36 | void pid_getmem(unsigned pid, unsigned *rss, unsigned *shared) { |
@@ -303,20 +303,22 @@ void pid_store_cpu(unsigned index, unsigned parent, unsigned *utime, unsigned *s | |||
303 | 303 | ||
304 | // mon_pid: pid of sandbox to be monitored, 0 if all sandboxes are included | 304 | // mon_pid: pid of sandbox to be monitored, 0 if all sandboxes are included |
305 | void pid_read(pid_t mon_pid) { | 305 | void pid_read(pid_t mon_pid) { |
306 | if (pids == NULL) { | 306 | FILE *fp = fopen("/proc/sys/kernel/pid_max", "r"); |
307 | FILE *fp = fopen("/proc/sys/kernel/pid_max", "r"); | 307 | if (fp) { |
308 | if (fp) { | 308 | int val; |
309 | int val; | 309 | if (fscanf(fp, "%d", &val) == 1) { |
310 | if (fscanf(fp, "%d", &val) == 1) { | 310 | if (val >= max_pids) |
311 | if (val >= max_pids) | 311 | max_pids = val + 1; |
312 | max_pids = val + 1; | ||
313 | } | ||
314 | fclose(fp); | ||
315 | } | 312 | } |
313 | fclose(fp); | ||
314 | } | ||
315 | |||
316 | if (pids == NULL) { | ||
316 | pids = malloc(sizeof(Process) * max_pids); | 317 | pids = malloc(sizeof(Process) * max_pids); |
317 | if (pids == NULL) | 318 | if (pids == NULL) |
318 | errExit("malloc"); | 319 | errExit("malloc"); |
319 | } | 320 | } |
321 | |||
320 | memset(pids, 0, sizeof(Process) * max_pids); | 322 | memset(pids, 0, sizeof(Process) * max_pids); |
321 | pid_t mypid = getpid(); | 323 | pid_t mypid = getpid(); |
322 | 324 | ||
@@ -332,9 +334,12 @@ void pid_read(pid_t mon_pid) { | |||
332 | 334 | ||
333 | struct dirent *entry; | 335 | struct dirent *entry; |
334 | char *end; | 336 | char *end; |
337 | pid_t new_max_pids = 0; | ||
335 | while ((entry = readdir(dir))) { | 338 | while ((entry = readdir(dir))) { |
336 | pid_t pid = strtol(entry->d_name, &end, 10); | 339 | pid_t pid = strtol(entry->d_name, &end, 10); |
337 | pid %= max_pids; | 340 | pid %= max_pids; |
341 | if (pid > new_max_pids) | ||
342 | new_max_pids = pid; | ||
338 | if (end == entry->d_name || *end) | 343 | if (end == entry->d_name || *end) |
339 | continue; | 344 | continue; |
340 | if (pid == mypid) | 345 | if (pid == mypid) |
@@ -418,6 +423,9 @@ void pid_read(pid_t mon_pid) { | |||
418 | } | 423 | } |
419 | closedir(dir); | 424 | closedir(dir); |
420 | 425 | ||
426 | // update max_pid | ||
427 | max_pids = new_max_pids; | ||
428 | |||
421 | pid_t pid; | 429 | pid_t pid; |
422 | for (pid = 0; pid < max_pids; pid++) { | 430 | for (pid = 0; pid < max_pids; pid++) { |
423 | int parent = pids[pid].parent; | 431 | int parent = pids[pid].parent; |