From 7af1f613fa37d82b29fb13fc1d37f0963389aa56 Mon Sep 17 00:00:00 2001 From: Florian Forster Date: Sun, 15 Feb 2009 15:01:05 +0100 Subject: [PATCH] cpu plugin: Check if all required sysctl defines are present. 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.. --- src/cpu.c | 103 ++++++++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 66 insertions(+), 37 deletions(-) diff --git a/src/cpu.c b/src/cpu.c index 6e8a62da..1f1284a1 100644 --- a/src/cpu.c +++ b/src/cpu.c @@ -49,7 +49,8 @@ # include #endif /* HAVE_LIBKSTAT */ -#ifdef HAVE_SYSCTLBYNAME +#if (defined(HAVE_SYSCTL) && HAVE_SYSCTL) \ + || (defined(HAVE_SYSCTLBYNAME) && HAVE_SYSCTLBYNAME) # ifdef HAVE_SYS_SYSCTL_H # include # endif @@ -66,24 +67,25 @@ # define CP_IDLE 4 # define CPUSTATES 5 # endif -#endif /* HAVE_SYSCTLBYNAME */ - -#ifdef __OpenBSD__ -# ifdef HAVE_SYS_SYSCTL_H -# include -# endif - -# ifdef HAVE_SYS_DKSTAT_H -# include +#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 #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 @@ -111,7 +113,11 @@ static kstat_t *ksp[MAX_NUMCPU]; 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 */ @@ -156,37 +162,41 @@ static int init (void) 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 */ @@ -387,50 +397,69 @@ static int cpu_read (void) } /* #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]; -- 2.11.0