Merge branch 'collectd-5.5' into collectd-5.6
[collectd.git] / src / contextswitch.c
index 56d8bf0..76e2a6c 100644 (file)
@@ -1,6 +1,7 @@
 /**
  * collectd - src/contextswitch.c
  * Copyright (C) 2009  Patrik Weiskircher
+ * Copyright (C) 2010  Kimo Rosenbaum
  *
  * 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
  *
  * Authors:
  *   Patrik Weiskircher <weiskircher at inqnet.at>
+ *   Kimo Rosenbaum <http://github.com/kimor79>
  **/
 
 #include "collectd.h"
+
 #include "common.h"
 #include "plugin.h"
 
 /* no global variables */
 /* #endif KERNEL_LINUX */
 
+#elif HAVE_PERFSTAT
+# include <sys/protosw.h>
+# include <libperfstat.h>
+/* #endif HAVE_PERFSTAT */
+
 #else
 # error "No applicable input method."
 #endif
@@ -57,29 +65,31 @@ static void cs_submit (derive_t context_switches)
 
 static int cs_read (void)
 {
-       int status = -2;
 #if HAVE_SYSCTLBYNAME
-       int value;
+       int value = 0;
        size_t value_len = sizeof (value);
+       int status;
 
-       if (sysctlbyname ("vm.stats.sys.v_swtch", (void *) &value, &value_len,
-                       NULL, 0) == 0)
-       {
-               cs_submit(value);
-               status = 0;
-       }
-       else
+       status = sysctlbyname ("vm.stats.sys.v_swtch",
+                       &value, &value_len,
+                       /* new pointer = */ NULL, /* new length = */ 0);
+       if (status != 0)
        {
-               ERROR("contextswitch plugin: sysctlbyname failed");
+               ERROR("contextswitch plugin: sysctlbyname "
+                               "(vm.stats.sys.v_swtch) failed");
+               return (-1);
        }
 
+       cs_submit (value);
 /* #endif HAVE_SYSCTLBYNAME */
+
 #elif KERNEL_LINUX
        FILE *fh;
        char buffer[64];
        int numfields;
        char *fields[3];
        derive_t result = 0;
+       int status = -2;
 
        fh = fopen ("/proc/stat", "r");
        if (fh == NULL) {
@@ -117,7 +127,24 @@ static int cs_read (void)
 
        if (status == -2)
                ERROR ("contextswitch plugin: Unable to find context switch value.");
-#endif /* KERNEL_LINUX */
+/* #endif  KERNEL_LINUX */
+
+#elif HAVE_PERFSTAT
+       int status = 0;
+       perfstat_cpu_total_t perfcputotal;
+
+       status = perfstat_cpu_total(NULL, &perfcputotal, sizeof(perfstat_cpu_total_t), 1);
+       if (status < 0)
+       {
+               char errbuf[1024];
+               ERROR ("contextswitch plugin: perfstat_cpu_total: %s",
+                       sstrerror (errno, errbuf, sizeof (errbuf)));
+               return (-1);
+       }
+
+       cs_submit(perfcputotal.pswitch);
+       status = 0;
+#endif /* defined(HAVE_PERFSTAT) */
 
        return status;
 }