Merge branch 'collectd-4.8' into collectd-4.9
[collectd.git] / src / processes.c
index bda096a..f2eb0a3 100644 (file)
@@ -4,6 +4,7 @@
  * Copyright (C) 2006-2008  Florian octo Forster
  * Copyright (C) 2008       Oleg King
  * Copyright (C) 2009       Sebastian Harl
+ * Copyright (C) 2009       Andrés J. Díaz
  * Copyright (C) 2009       Manuel Sanmartin
  *
  * This program is free software; you can redistribute it and/or modify it
@@ -25,6 +26,7 @@
  *   Florian octo Forster <octo at verplant.org>
  *   Oleg King <king2 at kaluga.ru>
  *   Sebastian Harl <sh at tokkee.org>
+ *   Andrés J. Díaz <ajdiaz at connectical.com>
  *   Manuel Sanmartin
  **/
 
@@ -148,10 +150,10 @@ typedef struct procstat_entry_s
        unsigned long cpu_system_counter;
 
        /* io data */
-       long io_rchar;
-       long io_wchar;
-       long io_syscr;
-       long io_syscw;
+       derive_t io_rchar;
+       derive_t io_wchar;
+       derive_t io_syscr;
+       derive_t io_syscw;
 
        struct procstat_entry_s *next;
 } procstat_entry_t;
@@ -177,10 +179,10 @@ typedef struct procstat
        unsigned long cpu_system_counter;
 
        /* io data */
-       long io_rchar;
-       long io_wchar;
-       long io_syscr;
-       long io_syscw;
+       derive_t io_rchar;
+       derive_t io_wchar;
+       derive_t io_syscr;
+       derive_t io_syscw;
 
        struct procstat   *next;
        struct procstat_entry_s *instances;
@@ -260,13 +262,13 @@ static void ps_list_register (const char *name, const char *regexp)
                ERROR ("processes plugin: ps_list_register: "
                                "Regular expression \"%s\" found in config "
                                "file, but support for regular expressions "
-                               "has been dispabled at compile time.",
+                               "has been disabled at compile time.",
                                regexp);
                sfree (new);
                return;
        }
 #endif
-       
+
        for (ptr = list_head_g; ptr != NULL; ptr = ptr->next)
        {
                if (strcmp (ptr->name, name) == 0)
@@ -342,13 +344,13 @@ static void ps_list_add (const char *name, const char *cmdline, procstat_entry_t
                if ((pse == NULL) || (pse->id != entry->id))
                {
                        procstat_entry_t *new;
-                       
+
                        new = (procstat_entry_t *) malloc (sizeof (procstat_entry_t));
                        if (new == NULL)
                                return;
                        memset (new, 0, sizeof (procstat_entry_t));
                        new->id = entry->id;
-                       
+
                        if (pse == NULL)
                                ps->instances = new;
                        else
@@ -400,7 +402,7 @@ static void ps_list_add (const char *name, const char *cmdline, procstat_entry_t
                                pse->vmem_minflt = entry->vmem_minflt_counter - pse->vmem_minflt_counter;
                        }
                        pse->vmem_minflt_counter = entry->vmem_minflt_counter;
-                       
+
                        if (entry->vmem_majflt_counter < pse->vmem_majflt_counter)
                        {
                                pse->vmem_majflt = entry->vmem_majflt_counter
@@ -437,7 +439,7 @@ static void ps_list_add (const char *name, const char *cmdline, procstat_entry_t
                                pse->cpu_user = entry->cpu_user_counter - pse->cpu_user_counter;
                        }
                        pse->cpu_user_counter = entry->cpu_user_counter;
-                       
+
                        if (entry->cpu_system_counter < pse->cpu_system_counter)
                        {
                                pse->cpu_system = entry->cpu_system_counter
@@ -662,8 +664,8 @@ static void ps_submit_proc_list (procstat_t *ps)
        if ( (ps->io_rchar != -1) && (ps->io_wchar != -1) )
        {
                sstrncpy (vl.type, "ps_disk_octets", sizeof (vl.type));
-               vl.values[0].counter = ps->io_rchar;
-               vl.values[1].counter = ps->io_wchar;
+               vl.values[0].derive = ps->io_rchar;
+               vl.values[1].derive = ps->io_wchar;
                vl.values_len = 2;
                plugin_dispatch_values (&vl);
        }
@@ -671,8 +673,8 @@ static void ps_submit_proc_list (procstat_t *ps)
        if ( (ps->io_syscr != -1) && (ps->io_syscw != -1) )
        {
                sstrncpy (vl.type, "ps_disk_ops", sizeof (vl.type));
-               vl.values[0].counter = ps->io_syscr;
-               vl.values[1].counter = ps->io_syscw;
+               vl.values[0].derive = ps->io_syscr;
+               vl.values[1].derive = ps->io_syscw;
                vl.values_len = 2;
                plugin_dispatch_values (&vl);
        }
@@ -680,8 +682,8 @@ static void ps_submit_proc_list (procstat_t *ps)
        DEBUG ("name = %s; num_proc = %lu; num_lwp = %lu; vmem_rss = %lu; "
                        "vmem_minflt_counter = %lu; vmem_majflt_counter = %lu; "
                        "cpu_user_counter = %lu; cpu_system_counter = %lu; "
-                       "io_rchar = %ld; io_wchar = %ld; "
-                       "io_syscr = %ld; io_syscw = %ld;",
+                       "io_rchar = %"PRIi64"; io_wchar = %"PRIi64"; "
+                       "io_syscr = %"PRIi64"; io_syscw = %"PRIi64";",
                        ps->name, ps->num_proc, ps->num_lwp, ps->vmem_rss,
                        ps->vmem_minflt_counter, ps->vmem_majflt_counter,
                        ps->cpu_user_counter, ps->cpu_system_counter,
@@ -732,7 +734,9 @@ static procstat_t *ps_read_io (int pid, procstat_t *ps)
 
        while (fgets (buffer, 1024, fh) != NULL)
        {
-               long *val = NULL;
+               derive_t *val = NULL;
+               long long tmp;
+               char *endptr;
 
                if (strncasecmp (buffer, "rchar:", 6) == 0)
                        val = &(ps->io_rchar);
@@ -750,8 +754,14 @@ static procstat_t *ps_read_io (int pid, procstat_t *ps)
                if (numfields < 2)
                        continue;
 
-               *val = atol (fields[1]);
-       }
+               errno = 0;
+               endptr = NULL;
+               tmp = strtoll (fields[1], &endptr, /* base = */ 10);
+               if ((errno != 0) || (endptr == fields[1]))
+                       *val = -1;
+               else
+                       *val = (derive_t) tmp;
+       } /* while (fgets) */
 
        if (fclose (fh))
        {
@@ -1572,6 +1582,7 @@ static int ps_read (void)
 /* #endif HAVE_LIBKVM_GETPROCS && HAVE_STRUCT_KINFO_PROC_FREEBSD */
 
 #elif HAVE_PROCINFO_H
+       /* AIX */
        int running  = 0;
        int sleeping = 0;
        int zombies  = 0;
@@ -1580,24 +1591,26 @@ static int ps_read (void)
        int blocked  = 0;
 
        pid_t pindex = 0;
-       tid64_t thindex;
-       int i;
-       int j;
-       int n;
        int nprocs;
-       int nthreads;
 
        procstat_t *ps;
        procstat_entry_t pse;
-       char arglist[MAXARGLN+1];
-       char *cmdline;
-       char *cargs;
 
        ps_list_reset ();
-       while ((nprocs = getprocs64(procentry, sizeof(struct procentry64), NULL, sizeof(struct fdsinfo64), &pindex, MAXPROCENTRY)) > 0 )
+       while ((nprocs = getprocs64 (procentry, sizeof(struct procentry64),
+                                       /* fdsinfo = */ NULL, sizeof(struct fdsinfo64),
+                                       &pindex, MAXPROCENTRY)) > 0)
        {
-               for ( i=0; i< nprocs; i++)
+               int i;
+
+               for (i = 0; i < nprocs; i++)
                {
+                       tid64_t thindex;
+                       int nthreads;
+                       char arglist[MAXARGLN+1];
+                       char *cargs;
+                       char *cmdline;
+
                        if (procentry[i].pi_state == SNONE) continue;
                        /* if (procentry[i].pi_state == SZOMB)  FIXME */
 
@@ -1613,6 +1626,8 @@ static int ps_read (void)
                        {
                                if (getargs(&procentry[i], sizeof(struct procentry64), arglist, MAXARGLN) >= 0)
                                {
+                                       int n;
+
                                        n = -1;
                                        while (++n < MAXARGLN)
                                        {
@@ -1633,8 +1648,12 @@ static int ps_read (void)
                        pse.num_proc = 1;
 
                        thindex=0;
-                       while ((nthreads = getthrds64(procentry[i].pi_pid, thrdentry, sizeof(struct thrdentry64), &thindex, MAXTHRDENTRY)) > 0)
+                       while ((nthreads = getthrds64(procentry[i].pi_pid,
+                                                       thrdentry, sizeof(struct thrdentry64),
+                                                       &thindex, MAXTHRDENTRY)) > 0)
                        {
+                               int j;
+
                                for (j=0; j< nthreads; j++)
                                {
                                        switch (thrdentry[j].ti_state)
@@ -1672,10 +1691,11 @@ static int ps_read (void)
                        pse.stack_size =  0;
 
                        ps_list_add (cmdline, cargs, &pse);
-               }
+               } /* for (i = 0 .. nprocs) */
+
                if (nprocs < MAXPROCENTRY)
                        break;
-       }
+       } /* while (getprocs64() > 0) */
        ps_submit_state ("running",  running);
        ps_submit_state ("sleeping", sleeping);
        ps_submit_state ("zombies",  zombies);