From: Florian Forster Date: Thu, 17 Sep 2009 16:34:19 +0000 (+0200) Subject: Merge branch 'collectd-4.8' X-Git-Tag: collectd-4.9.0~77 X-Git-Url: https://git.octo.it/?a=commitdiff_plain;h=beefe438cc1e7119e2ba448cb190ec9ffa0b8e9e;hp=111064d7154cd6a5a781fb9c13cd9829c95ec7d9;p=collectd.git Merge branch 'collectd-4.8' --- diff --git a/src/perl.c b/src/perl.c index 50def1fc..a2f5da29 100644 --- a/src/perl.c +++ b/src/perl.c @@ -145,6 +145,11 @@ typedef struct { } while (0) /* + * Public variable + */ +extern char **environ; + +/* * private variables */ diff --git a/src/processes.c b/src/processes.c index 261accbc..fd06b21b 100644 --- a/src/processes.c +++ b/src/processes.c @@ -617,65 +617,31 @@ static void ps_submit_proc_list (procstat_t *ps) /* ------- additional functions for KERNEL_LINUX/HAVE_THREAD_INFO ------- */ #if KERNEL_LINUX -static int *ps_read_tasks (int pid) +static int ps_read_tasks (int pid) { - int *list = NULL; - int list_size = 1; /* size of allocated space, in elements */ - int list_len = 0; /* number of currently used elements */ - char dirname[64]; DIR *dh; struct dirent *ent; + int count = 0; ssnprintf (dirname, sizeof (dirname), "/proc/%i/task", pid); if ((dh = opendir (dirname)) == NULL) { DEBUG ("Failed to open directory `%s'", dirname); - return (NULL); + return (-1); } while ((ent = readdir (dh)) != NULL) { - if (!isdigit (ent->d_name[0])) + if (!isdigit ((int) ent->d_name[0])) continue; - - if ((list_len + 1) >= list_size) - { - int *new_ptr; - int new_size = 2 * list_size; - /* Comes in sizes: 2, 4, 8, 16, ... */ - - new_ptr = (int *) realloc (list, (size_t) (sizeof (int) * new_size)); - if (new_ptr == NULL) - { - if (list != NULL) - free (list); - ERROR ("processes plugin: " - "Failed to allocate more memory."); - return (NULL); - } - - list = new_ptr; - list_size = new_size; - - memset (list + list_len, 0, sizeof (int) * (list_size - list_len)); - } - - list[list_len] = atoi (ent->d_name); - if (list[list_len] != 0) - list_len++; + else + count++; } - closedir (dh); - if (list_len == 0) - return (NULL); - - assert (list_len < list_size); - assert (list[list_len] == 0); - - return (list); + return ((count >= 1) ? count : 1); } /* int *ps_read_tasks */ int ps_read_process (int pid, procstat_t *ps, char *state) @@ -686,7 +652,6 @@ int ps_read_process (int pid, procstat_t *ps, char *state) char *fields[64]; char fields_len; - int *tasks; int i; int ppid; @@ -736,21 +701,11 @@ int ps_read_process (int pid, procstat_t *ps, char *state) ps->num_lwp = 0; ps->num_proc = 0; } - else if ((tasks = ps_read_tasks (pid)) == NULL) - { - /* Kernel 2.4 or so */ - ps->num_lwp = 1; - ps->num_proc = 1; - } else { - ps->num_lwp = 0; + if ( (ps->num_lwp = ps_read_tasks (pid)) == -1 ) + return (-1); ps->num_proc = 1; - for (i = 0; tasks[i] != 0; i++) - ps->num_lwp++; - - free (tasks); - tasks = NULL; } /* Leave the rest at zero if this is only a zombi */