X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fprocesses.c;h=fd06b21b4949d88cff169806d01abee98720ce03;hb=be99a844a40d7037a910d37a894988b807631a6e;hp=261accbcbc7582218c6f5744cb818beba533ffe8;hpb=108068f268cad453e5d3b54e288917409db1e467;p=collectd.git 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 */