diff --git a/src/cpu.c b/src/cpu.c
index f842b494b0eaf340b00a776f07648b898308c164..64ce5df9e27b8158942c70203ceb763a54f1bead 100644 (file)
--- a/src/cpu.c
+++ b/src/cpu.c
/**
* collectd - src/cpu.c
- * Copyright (C) 2005-2007 Florian octo Forster
+ * Copyright (C) 2005-2009 Florian octo Forster
+ * 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
*
* Authors:
* Florian octo Forster <octo at verplant.org>
+ * Oleg King <king2 at kaluga.ru>
+ * Simon Kuhnle <simon at blarzwurst.de>
**/
#include "collectd.h"
# include <sys/sysinfo.h>
#endif /* HAVE_LIBKSTAT */
-#ifdef HAVE_SYSCTLBYNAME
+#if (defined(HAVE_SYSCTL) && HAVE_SYSCTL) \
+ || (defined(HAVE_SYSCTLBYNAME) && HAVE_SYSCTLBYNAME)
# ifdef HAVE_SYS_SYSCTL_H
# include <sys/sysctl.h>
# endif
# define CP_IDLE 4
# define CPUSTATES 5
# endif
-#endif /* HAVE_SYSCTLBYNAME */
-
-#ifdef __OpenBSD__
-# ifdef HAVE_SYS_SYSCTL_H
-# include <sys/sysctl.h>
-# endif
-
-# ifdef HAVE_SYS_DKSTAT_H
-# include <sys/dkstat.h>
+#endif /* HAVE_SYSCTL || HAVE_SYSCTLBYNAME */
+
+#if HAVE_SYSCTL
+# if defined(CTL_HW) && defined(HW_NCPU) \
+ && defined(CTL_KERN) && defined(KERN_CPTIME) && defined(CPUSTATES)
+# define CAN_USE_SYSCTL 1
+# else
+# define CAN_USE_SYSCTL 0
# endif
-#endif /* __OpenBSD__ */
+#else
+# define CAN_USE_SYSCTL 0
+#endif
#if HAVE_STATGRAB_H
# include <statgrab.h>
#endif
#if !PROCESSOR_CPU_LOAD_INFO && !KERNEL_LINUX && !HAVE_LIBKSTAT \
- && !HAVE_SYSCTLBYNAME && !HAVE_LIBSTATGRAB && !__OpenBSD__
+ && !CAN_USE_SYSCTL && !HAVE_SYSCTLBYNAME && !HAVE_LIBSTATGRAB
# error "No applicable input method."
#endif
static int numcpu;
/* #endif HAVE_LIBKSTAT */
-#elif defined(HAVE_SYSCTLBYNAME) || __OpenBSD__
+#elif CAN_USE_SYSCTL
+static int numcpu;
+/* #endif CAN_USE_SYSCTL */
+
+#elif defined(HAVE_SYSCTLBYNAME)
static int numcpu;
/* #endif HAVE_SYSCTLBYNAME */
ksp[numcpu++] = ksp_chain;
/* #endif HAVE_LIBKSTAT */
-#elif defined (HAVE_SYSCTLBYNAME)
+#elif CAN_USE_SYSCTL
size_t numcpu_size;
+ int mib[2] = {CTL_HW, HW_NCPU};
+ int status;
+ numcpu = 0;
numcpu_size = sizeof (numcpu);
- if (sysctlbyname ("hw.ncpu", &numcpu, &numcpu_size, NULL, 0) < 0)
+ status = sysctl (mib, STATIC_ARRAY_SIZE (mib),
+ &numcpu, &numcpu_size, NULL, 0);
+ if (status == -1)
{
char errbuf[1024];
- WARNING ("cpu plugin: sysctlbyname: %s",
+ WARNING ("cpu plugin: sysctl: %s",
sstrerror (errno, errbuf, sizeof (errbuf)));
return (-1);
}
+/* #endif CAN_USE_SYSCTL */
- if (numcpu != 1)
- NOTICE ("cpu: Only one processor supported when using `sysctlbyname' (found %i)", numcpu);
-/* #endif HAVE_SYSCTLBYNAME */
-
-#elif defined __OpenBSD__
+#elif defined (HAVE_SYSCTLBYNAME)
size_t numcpu_size;
- int mib[2] = {CTL_HW, HW_NCPU};
numcpu_size = sizeof (numcpu);
- if (sysctl (mib, 2, &numcpu, &numcpu_size, NULL, 0) < 0)
+ if (sysctlbyname ("hw.ncpu", &numcpu, &numcpu_size, NULL, 0) < 0)
{
char errbuf[1024];
- WARNING ("cpu plugin: sysctl: %s",
+ WARNING ("cpu plugin: sysctlbyname: %s",
sstrerror (errno, errbuf, sizeof (errbuf)));
return (-1);
}
-/* #endif __OpenBSD__ */
+
+ if (numcpu != 1)
+ NOTICE ("cpu: Only one processor supported when using `sysctlbyname' (found %i)", numcpu);
+/* #endif HAVE_SYSCTLBYNAME */
#elif defined(HAVE_LIBSTATGRAB)
/* nothing to initialize */
}
/* #endif defined(HAVE_LIBKSTAT) */
-#elif defined(HAVE_SYSCTLBYNAME)
- long cpuinfo[CPUSTATES];
+#elif CAN_USE_SYSCTL
+ uint64_t cpuinfo[numcpu][CPUSTATES];
size_t cpuinfo_size;
+ int status;
+ int i;
- cpuinfo_size = sizeof (cpuinfo);
-
- if (sysctlbyname("kern.cp_time", &cpuinfo, &cpuinfo_size, NULL, 0) < 0)
+ if (numcpu < 1)
{
- char errbuf[1024];
- ERROR ("cpu plugin: sysctlbyname failed: %s.",
- sstrerror (errno, errbuf, sizeof (errbuf)));
+ ERROR ("cpu plugin: Could not determine number of "
+ "installed CPUs using sysctl(3).");
return (-1);
}
- submit (0, "user", cpuinfo[CP_USER]);
- submit (0, "nice", cpuinfo[CP_NICE]);
- submit (0, "system", cpuinfo[CP_SYS]);
- submit (0, "idle", cpuinfo[CP_IDLE]);
- submit (0, "interrupt", cpuinfo[CP_INTR]);
-/* #endif HAVE_SYSCTLBYNAME */
-
-#elif defined __OpenBSD__
- int64_t **cpuinfo;
- size_t cpuinfo_size;
- int i;
-
- cpuinfo = (int64_t **) calloc (numcpu, sizeof(int64_t *));
- if(cpuinfo == NULL) {
- ERROR ("cpu plugin: calloc failed.");
- return (-1);
- }
- for (i = 0; i < numcpu; i++) {
- cpuinfo[i] = (int64_t *) calloc (CPUSTATES, sizeof(int64_t));
- if (cpuinfo[i] == NULL) {
- ERROR ("cpu plugin: calloc failed.");
- return (-1);
- }
- }
+ memset (cpuinfo, 0, sizeof (cpuinfo));
+#if defined(KERN_CPTIME2)
if (numcpu > 1) {
- cpuinfo_size = CPUSTATES * sizeof(int64_t);
+ for (i = 0; i < numcpu; i++) {
+ int mib[] = {CTL_KERN, KERN_CPTIME2, i};
- for (i = 0; i < numcpu; i++) {
- int mib[] = {CTL_KERN, KERN_CPTIME2, i};
+ cpuinfo_size = sizeof (cpuinfo[0]);
- if (sysctl(mib, 3, cpuinfo[i], &cpuinfo_size, NULL, 0) < 0) {
+ status = sysctl (mib, STATIC_ARRAY_SIZE (mib),
+ cpuinfo[i], &cpuinfo_size, NULL, 0);
+ if (status == -1) {
char errbuf[1024];
ERROR ("cpu plugin: sysctl failed: %s.",
sstrerror (errno, errbuf, sizeof (errbuf)));
return (-1);
}
}
- } else {
+ }
+ else
+#endif /* defined(KERN_CPTIME2) */
+ {
int mib[] = {CTL_KERN, KERN_CPTIME};
long cpuinfo_tmp[CPUSTATES];
cpuinfo_size = sizeof(cpuinfo_tmp);
- if (sysctl(mib, 2, &cpuinfo_tmp, &cpuinfo_size, NULL, 0) < 0)
+ status = sysctl (mib, STATIC_ARRAY_SIZE (mib),
+ &cpuinfo_tmp, &cpuinfo_size, NULL, 0);
+ if (status == -1)
{
char errbuf[1024];
ERROR ("cpu plugin: sysctl failed: %s.",
sstrerror (errno, errbuf, sizeof (errbuf)));
return (-1);
}
+
for(i = 0; i < CPUSTATES; i++) {
cpuinfo[0][i] = cpuinfo_tmp[i];
}
}
for (i = 0; i < numcpu; i++) {
- cpuinfo[i][CP_SYS] += cpuinfo[i][CP_INTR];
+ 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 CAN_USE_SYSCTL */
- 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]);
+#elif defined(HAVE_SYSCTLBYNAME)
+ long cpuinfo[CPUSTATES];
+ size_t cpuinfo_size;
- free (cpuinfo[i]);
+ cpuinfo_size = sizeof (cpuinfo);
+
+ if (sysctlbyname("kern.cp_time", &cpuinfo, &cpuinfo_size, NULL, 0) < 0)
+ {
+ char errbuf[1024];
+ ERROR ("cpu plugin: sysctlbyname failed: %s.",
+ sstrerror (errno, errbuf, sizeof (errbuf)));
+ return (-1);
}
- free (cpuinfo);
-/* #endif __OpenBSD__ */
+
+ submit (0, "user", cpuinfo[CP_USER]);
+ submit (0, "nice", cpuinfo[CP_NICE]);
+ submit (0, "system", cpuinfo[CP_SYS]);
+ submit (0, "idle", cpuinfo[CP_IDLE]);
+ submit (0, "interrupt", cpuinfo[CP_INTR]);
+/* #endif HAVE_SYSCTLBYNAME */
#elif defined(HAVE_LIBSTATGRAB)
- sg_cpu_stats *cs;
- cs = sg_get_cpu_stats ();
-
- if (cs == NULL)
- {
- ERROR ("cpu plugin: sg_get_cpu_stats failed.");
- return (-1);
- }
-
- submit (0, "idle", (counter_t) cs->idle);
- submit (0, "nice", (counter_t) cs->nice);
- submit (0, "swap", (counter_t) cs->swap);
- submit (0, "system", (counter_t) cs->kernel);
- submit (0, "user", (counter_t) cs->user);
- submit (0, "wait", (counter_t) cs->iowait);
+ sg_cpu_stats *cs;
+ cs = sg_get_cpu_stats ();
+
+ if (cs == NULL)
+ {
+ ERROR ("cpu plugin: sg_get_cpu_stats failed.");
+ return (-1);
+ }
+
+ submit (0, "idle", (counter_t) cs->idle);
+ submit (0, "nice", (counter_t) cs->nice);
+ submit (0, "swap", (counter_t) cs->swap);
+ submit (0, "system", (counter_t) cs->kernel);
+ submit (0, "user", (counter_t) cs->user);
+ submit (0, "wait", (counter_t) cs->iowait);
#endif /* HAVE_LIBSTATGRAB */
return (0);