X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fcpu.c;h=f842b494b0eaf340b00a776f07648b898308c164;hb=b3a21db6b95c734ab528f35a1fa0ef483843fa82;hp=0fadc06458d2fbb5ace382a731bb6bcf19283bb3;hpb=7a36927e0c5411c701d9e1bfd3f02a9c2f254d0f;p=collectd.git diff --git a/src/cpu.c b/src/cpu.c index 0fadc064..f842b494 100644 --- a/src/cpu.c +++ b/src/cpu.c @@ -68,12 +68,22 @@ # endif #endif /* HAVE_SYSCTLBYNAME */ +#ifdef __OpenBSD__ +# ifdef HAVE_SYS_SYSCTL_H +# include +# endif + +# ifdef HAVE_SYS_DKSTAT_H +# include +# endif +#endif /* __OpenBSD__ */ + #if HAVE_STATGRAB_H # include #endif #if !PROCESSOR_CPU_LOAD_INFO && !KERNEL_LINUX && !HAVE_LIBKSTAT \ - && !HAVE_SYSCTLBYNAME && !HAVE_LIBSTATGRAB + && !HAVE_SYSCTLBYNAME && !HAVE_LIBSTATGRAB && !__OpenBSD__ # error "No applicable input method." #endif @@ -101,7 +111,7 @@ static kstat_t *ksp[MAX_NUMCPU]; static int numcpu; /* #endif HAVE_LIBKSTAT */ -#elif defined(HAVE_SYSCTLBYNAME) +#elif defined(HAVE_SYSCTLBYNAME) || __OpenBSD__ static int numcpu; /* #endif HAVE_SYSCTLBYNAME */ @@ -163,6 +173,21 @@ static int init (void) NOTICE ("cpu: Only one processor supported when using `sysctlbyname' (found %i)", numcpu); /* #endif HAVE_SYSCTLBYNAME */ +#elif defined __OpenBSD__ + 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) + { + char errbuf[1024]; + WARNING ("cpu plugin: sysctl: %s", + sstrerror (errno, errbuf, sizeof (errbuf))); + return (-1); + } +/* #endif __OpenBSD__ */ + #elif defined(HAVE_LIBSTATGRAB) /* nothing to initialize */ #endif /* HAVE_LIBSTATGRAB */ @@ -179,15 +204,14 @@ static void submit (int cpu_num, const char *type_instance, counter_t value) vl.values = values; vl.values_len = 1; - vl.time = time (NULL); sstrncpy (vl.host, hostname_g, sizeof (vl.host)); sstrncpy (vl.plugin, "cpu", sizeof (vl.plugin)); - snprintf (vl.plugin_instance, sizeof (vl.type_instance), + ssnprintf (vl.plugin_instance, sizeof (vl.type_instance), "%i", cpu_num); - vl.plugin_instance[DATA_MAX_NAME_LEN - 1] = '\0'; + sstrncpy (vl.type, "cpu", sizeof (vl.type)); sstrncpy (vl.type_instance, type_instance, sizeof (vl.type_instance)); - plugin_dispatch_values ("cpu", &vl); + plugin_dispatch_values (&vl); } static int cpu_read (void) @@ -377,14 +401,75 @@ static int cpu_read (void) return (-1); } - cpuinfo[CP_SYS] += cpuinfo[CP_INTR]; - 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); + } + } + + if (numcpu > 1) { + cpuinfo_size = CPUSTATES * sizeof(int64_t); + + for (i = 0; i < numcpu; i++) { + int mib[] = {CTL_KERN, KERN_CPTIME2, i}; + + if (sysctl(mib, 3, cpuinfo[i], &cpuinfo_size, NULL, 0) < 0) { + char errbuf[1024]; + ERROR ("cpu plugin: sysctl failed: %s.", + sstrerror (errno, errbuf, sizeof (errbuf))); + return (-1); + } + } + } else { + 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) + { + 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]); + + free (cpuinfo[i]); + } + free (cpuinfo); +/* #endif __OpenBSD__ */ + #elif defined(HAVE_LIBSTATGRAB) sg_cpu_stats *cs; cs = sg_get_cpu_stats ();