summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 034b20c)
raw | patch | inline | side by side (parent: 034b20c)
author | Florian Forster <octo@leeloo.lan.home.verplant.org> | |
Sun, 15 Feb 2009 14:01:05 +0000 (15:01 +0100) | ||
committer | Florian Forster <octo@leeloo.lan.home.verplant.org> | |
Sun, 15 Feb 2009 14:07:37 +0000 (15:07 +0100) |
Rather than checking for OpenBSD, since this interface may work with
other *BSDs, too. The order of the initialization code has been fixed,
too, and some other minor fixes..
other *BSDs, too. The order of the initialization code has been fixed,
too, and some other minor fixes..
src/cpu.c | patch | blob | history |
diff --git a/src/cpu.c b/src/cpu.c
index 6e8a62da593ca50d7d53383584a3f21a27580f01..1f1284a1b046ba7d4582982e05749a790bb4d9e9 100644 (file)
--- a/src/cpu.c
+++ b/src/cpu.c
# 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 __OpenBSD__
- int64_t cpuinfo[numcpu][CPUSTATES];
+#elif CAN_USE_SYSCTL
+ uint64_t cpuinfo[numcpu][CPUSTATES];
size_t cpuinfo_size;
+ int status;
int i;
- if (numcpu > 1) {
- cpuinfo_size = CPUSTATES * sizeof(int64_t);
+ if (numcpu < 1)
+ {
+ ERROR ("cpu plugin: Could not determine number of "
+ "installed CPUs using sysctl(3).");
+ return (-1);
+ }
+
+ memset (cpuinfo, 0, sizeof (cpuinfo));
+#if defined(KERN_CPTIME2)
+ if (numcpu > 1) {
for (i = 0; i < numcpu; i++) {
int mib[] = {CTL_KERN, KERN_CPTIME2, i};
- if (sysctl(mib, 3, cpuinfo[i], &cpuinfo_size, NULL, 0) < 0) {
+ cpuinfo_size = sizeof (cpuinfo[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++) {
- 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, "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 __OpenBSD__ */
+/* #endif CAN_USE_SYSCTL */
#elif defined(HAVE_SYSCTLBYNAME)
long cpuinfo[CPUSTATES];