X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fcpufreq.c;h=285ee6c6819931b8635aca06d1ac088dff67601b;hb=f46301fdc32e9cd13a757dbc005d2b66d5188193;hp=e4caf5ffb4015da1bc1a0c98b26d4eca16b2e88c;hpb=06adec208286b5a136ffa5c5f3832c35e9f62844;p=collectd.git diff --git a/src/cpufreq.c b/src/cpufreq.c index e4caf5ff..285ee6c6 100644 --- a/src/cpufreq.c +++ b/src/cpufreq.c @@ -21,35 +21,14 @@ **/ #include "collectd.h" + #include "common.h" #include "plugin.h" -#define MODULE_NAME "cpufreq" - -#if defined(KERNEL_LINUX) -# define CPUFREQ_HAVE_READ 1 -#else -# define CPUFREQ_HAVE_READ 0 -#endif - -static data_source_t data_source[1] = -{ - {"value", DS_TYPE_GAUGE, 0, NAN} -}; - -static data_set_t data_set = -{ - "cpufreq", 1, data_source -}; - -#if CPUFREQ_HAVE_READ -#ifdef KERNEL_LINUX static int num_cpu = 0; -#endif static int cpufreq_init (void) { -#ifdef KERNEL_LINUX int status; char filename[256]; @@ -57,10 +36,10 @@ static int cpufreq_init (void) while (1) { - status = snprintf (filename, sizeof (filename), + status = ssnprintf (filename, sizeof (filename), "/sys/devices/system/cpu/cpu%d/cpufreq/" "scaling_cur_freq", num_cpu); - if (status < 1 || status >= sizeof (filename)) + if ((status < 1) || ((unsigned int)status >= sizeof (filename))) break; if (access (filename, R_OK)) @@ -74,97 +53,49 @@ static int cpufreq_init (void) if (num_cpu == 0) plugin_unregister_read ("cpufreq"); -#endif /* defined(KERNEL_LINUX) */ return (0); } /* int cpufreq_init */ -static void cpufreq_submit (int cpu_num, double value) +static void cpufreq_submit (int cpu_num, value_t value) { - value_t values[1]; value_list_t vl = VALUE_LIST_INIT; - values[0].gauge = value; - - vl.values = values; + vl.values = &value; vl.values_len = 1; - vl.time = time (NULL); - strcpy (vl.host, hostname_g); - strcpy (vl.plugin, "cpufreq"); - snprintf (vl.type_instance, sizeof (vl.type_instance), - "%i", cpu_num); + sstrncpy (vl.plugin, "cpufreq", sizeof (vl.plugin)); + sstrncpy (vl.type, "cpufreq", sizeof (vl.type)); + ssnprintf (vl.type_instance, sizeof (vl.type_instance), "%i", cpu_num); - plugin_dispatch_values ("cpufreq", &vl); + plugin_dispatch_values (&vl); } static int cpufreq_read (void) { -#ifdef KERNEL_LINUX - int status; - unsigned long long val; - int i = 0; - FILE *fp; - char filename[256]; - char buffer[16]; - - for (i = 0; i < num_cpu; i++) + for (int i = 0; i < num_cpu; i++) { - status = snprintf (filename, sizeof (filename), - "/sys/devices/system/cpu/cpu%d/cpufreq/" - "scaling_cur_freq", i); - if (status < 1 || status >= sizeof (filename)) - return (-1); - - if ((fp = fopen (filename, "r")) == NULL) - { - char errbuf[1024]; - WARNING ("cpufreq: fopen (%s): %s", filename, - sstrerror (errno, errbuf, - sizeof (errbuf))); - return (-1); - } + char filename[PATH_MAX]; + ssnprintf (filename, sizeof (filename), + "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_cur_freq", i); - if (fgets (buffer, 16, fp) == NULL) + value_t v; + if (parse_value_file (filename, &v, DS_TYPE_GAUGE) != 0) { - char errbuf[1024]; - WARNING ("cpufreq: fgets: %s", - sstrerror (errno, errbuf, - sizeof (errbuf))); - fclose (fp); - return (-1); + WARNING ("cpufreq plugin: Reading \"%s\" failed.", filename); + continue; } - if (fclose (fp)) - { - char errbuf[1024]; - WARNING ("cpufreq: fclose: %s", - sstrerror (errno, errbuf, - sizeof (errbuf))); - } + /* convert kHz to Hz */ + v.gauge *= 1000.0; - - /* You're seeing correctly: The file is reporting kHz values.. */ - val = atoll (buffer) * 1000; - - cpufreq_submit (i, val); + cpufreq_submit (i, v); } -#endif /* defined(KERNEL_LINUX) */ return (0); } /* int cpufreq_read */ -#endif /* CPUFREQ_HAVE_READ */ -#undef BUFSIZE -void module_register (modreg_e load) +void module_register (void) { - if (load & MR_DATASETS) - plugin_register_data_set (&data_set); - -#if CPUFREQ_HAVE_READ - if (load & MR_READ) - { - plugin_register_init ("cpufreq", cpufreq_init); - plugin_register_read ("cpufreq", cpufreq_read); - } -#endif /* CPUFREQ_HAVE_READ */ + plugin_register_init ("cpufreq", cpufreq_init); + plugin_register_read ("cpufreq", cpufreq_read); }