erlang plugin: Have "send_error" free the *entire* term.
[collectd.git] / src / cpu.c
index 8a4e10e..c4bd1a6 100644 (file)
--- a/src/cpu.c
+++ b/src/cpu.c
@@ -1,7 +1,8 @@
 /**
  * collectd - src/cpu.c
  * Copyright (C) 2005-2009  Florian octo Forster
- * Copyright (C) 2009 Simon Kuhnle
+ * Copyright (C) 2008       Oleg King
+ * Copyright (C) 2009       Simon Kuhnle
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the
@@ -18,6 +19,7 @@
  *
  * Authors:
  *   Florian octo Forster <octo at verplant.org>
+ *   Oleg King <king2 at kaluga.ru>
  *   Simon Kuhnle <simon at blarzwurst.de>
  **/
 
@@ -196,8 +198,10 @@ static int init (void)
                return (-1);
        }
 
+#ifndef HAVE_SYSCTL_KERN_CP_TIMES
        if (numcpu != 1)
                NOTICE ("cpu: Only one processor supported when using `sysctlbyname' (found %i)", numcpu);
+#endif
 /* #endif HAVE_SYSCTLBYNAME */
 
 #elif defined(HAVE_LIBSTATGRAB)
@@ -218,7 +222,7 @@ static void submit (int cpu_num, const char *type_instance, counter_t value)
        vl.values_len = 1;
        sstrncpy (vl.host, hostname_g, sizeof (vl.host));
        sstrncpy (vl.plugin, "cpu", sizeof (vl.plugin));
-       ssnprintf (vl.plugin_instance, sizeof (vl.type_instance),
+       ssnprintf (vl.plugin_instance, sizeof (vl.plugin_instance),
                        "%i", cpu_num);
        sstrncpy (vl.type, "cpu", sizeof (vl.type));
        sstrncpy (vl.type_instance, type_instance, sizeof (vl.type_instance));
@@ -462,7 +466,30 @@ static int cpu_read (void)
                submit (i, "interrupt", cpuinfo[i][CP_INTR]);
        }
 /* #endif CAN_USE_SYSCTL */
+#elif defined(HAVE_SYSCTLBYNAME) && defined(HAVE_SYSCTL_KERN_CP_TIMES)
+       long cpuinfo[numcpu][CPUSTATES];
+       size_t cpuinfo_size;
+       int i;
+
+       memset (cpuinfo, 0, sizeof (cpuinfo));
+
+       cpuinfo_size = sizeof (cpuinfo);
+       if (sysctlbyname("kern.cp_times", &cpuinfo, &cpuinfo_size, NULL, 0) < 0)
+       {
+               char errbuf[1024];
+               ERROR ("cpu plugin: sysctlbyname failed: %s.",
+                               sstrerror (errno, errbuf, sizeof (errbuf)));
+               return (-1);
+       }
 
+       for (i = 0; i < numcpu; i++) {
+               submit (i, "user", cpuinfo[i][CP_USER]);
+               submit (i, "nice", cpuinfo[i][CP_NICE]);
+               submit (i, "system", cpuinfo[i][CP_SYS]);
+               submit (i, "idle", cpuinfo[i][CP_IDLE]);
+               submit (i, "interrupt", cpuinfo[i][CP_INTR]);
+       }
+/* #endif HAVE_SYSCTL_KERN_CP_TIMES */
 #elif defined(HAVE_SYSCTLBYNAME)
        long cpuinfo[CPUSTATES];
        size_t cpuinfo_size;