X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fcontextswitch.c;h=76e2a6c0b935c9225d50e96e7c2405554f459476;hb=5523a080010dcb7a61dc0dccc3969a2a048e52f9;hp=56d8bf09ee490f79bf148eaff6d67947ad98d1f2;hpb=1538fa84b575c8cc8fc19345c7bc597a2069f19d;p=collectd.git diff --git a/src/contextswitch.c b/src/contextswitch.c index 56d8bf09..76e2a6c0 100644 --- a/src/contextswitch.c +++ b/src/contextswitch.c @@ -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 @@ -17,9 +18,11 @@ * * Authors: * Patrik Weiskircher + * Kimo Rosenbaum **/ #include "collectd.h" + #include "common.h" #include "plugin.h" @@ -35,6 +38,11 @@ /* no global variables */ /* #endif KERNEL_LINUX */ +#elif HAVE_PERFSTAT +# include +# include +/* #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; }