X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fcpu.c;h=c4bd1a6d8459d7e3acb8c622734deadf784270f7;hb=be99a844a40d7037a910d37a894988b807631a6e;hp=6e8a62da593ca50d7d53383584a3f21a27580f01;hpb=034b20cd422bdfbf74cb69822d700724eeb51fe6;p=collectd.git diff --git a/src/cpu.c b/src/cpu.c index 6e8a62da..c4bd1a6d 100644 --- a/src/cpu.c +++ b/src/cpu.c @@ -1,6 +1,8 @@ /** * 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 @@ -17,6 +19,8 @@ * * Authors: * Florian octo Forster + * Oleg King + * Simon Kuhnle **/ #include "collectd.h" @@ -49,7 +53,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 +71,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 +117,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 +166,43 @@ 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__ */ + +#ifndef HAVE_SYSCTL_KERN_CP_TIMES + if (numcpu != 1) + NOTICE ("cpu: Only one processor supported when using `sysctlbyname' (found %i)", numcpu); +#endif +/* #endif HAVE_SYSCTLBYNAME */ #elif defined(HAVE_LIBSTATGRAB) /* nothing to initialize */ @@ -206,7 +222,7 @@ static void submit (int cpu_num, const char *type_instance, counter_t value) vl.values_len = 1; sstrncpy (vl.host, hostname_g, sizeof (vl.host)); sstrncpy (vl.plugin, "cpu", sizeof (vl.plugin)); - ssnprintf (vl.plugin_instance, sizeof (vl.type_instance), + ssnprintf (vl.plugin_instance, sizeof (vl.plugin_instance), "%i", cpu_num); sstrncpy (vl.type, "cpu", sizeof (vl.type)); sstrncpy (vl.type_instance, type_instance, sizeof (vl.type_instance)); @@ -387,51 +403,93 @@ 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, "interrupt", cpuinfo[i][CP_INTR]); + } +/* #endif CAN_USE_SYSCTL */ +#elif defined(HAVE_SYSCTLBYNAME) && defined(HAVE_SYSCTL_KERN_CP_TIMES) + long cpuinfo[numcpu][CPUSTATES]; + size_t cpuinfo_size; + int i; + + memset (cpuinfo, 0, sizeof (cpuinfo)); + + cpuinfo_size = sizeof (cpuinfo); + if (sysctlbyname("kern.cp_times", &cpuinfo, &cpuinfo_size, NULL, 0) < 0) + { + char errbuf[1024]; + ERROR ("cpu plugin: sysctlbyname failed: %s.", + sstrerror (errno, errbuf, sizeof (errbuf))); + return (-1); + } + + 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, "interrupt", cpuinfo[i][CP_INTR]); } -/* #endif __OpenBSD__ */ - +/* #endif HAVE_SYSCTL_KERN_CP_TIMES */ #elif defined(HAVE_SYSCTLBYNAME) long cpuinfo[CPUSTATES]; size_t cpuinfo_size;