X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fcpufreq.c;h=42248a98deebf9a8b4a5f6e5d5e7f76c72e0b2e9;hb=06a86a60a7dabc685bdbd81ce3d36ea5f7e2c2d4;hp=008ef39f1029b128c0d237994cb4293e5c9a9dff;hpb=2d897a731bd23f7a33b89e7b7e3004b6b26b5a94;p=collectd.git diff --git a/src/cpufreq.c b/src/cpufreq.c index 008ef39f..851aad42 100644 --- a/src/cpufreq.c +++ b/src/cpufreq.c @@ -21,134 +21,74 @@ **/ #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 int num_cpu; -static data_source_t data_source[1] = -{ - {"value", DS_TYPE_GAUGE, 0, NAN} -}; +static int cpufreq_init(void) { + int status; + char filename[256]; -static data_set_t data_set = -{ - "cpufreq", 1, data_source -}; + num_cpu = 0; -#if CPUFREQ_HAVE_READ -#ifdef KERNEL_LINUX -static int num_cpu = 0; -#endif + while (1) { + status = snprintf(filename, sizeof(filename), + "/sys/devices/system/cpu/cpu%d/cpufreq/" + "scaling_cur_freq", + num_cpu); + if ((status < 1) || ((unsigned int)status >= sizeof(filename))) + break; -static int cpufreq_init (void) -{ -#ifdef KERNEL_LINUX - int status; - char filename[256]; + if (access(filename, R_OK)) + break; - num_cpu = 0; + num_cpu++; + } - while (1) - { - status = snprintf (filename, sizeof (filename), - "/sys/devices/system/cpu/cpu%d/cpufreq/" - "scaling_cur_freq", num_cpu); - if (status < 1 || status >= sizeof (filename)) - break; + INFO("cpufreq plugin: Found %d CPU%s", num_cpu, (num_cpu == 1) ? "" : "s"); - if (access (filename, R_OK)) - break; + if (num_cpu == 0) + plugin_unregister_read("cpufreq"); - num_cpu++; - } + return 0; +} /* int cpufreq_init */ - syslog (LOG_INFO, "cpufreq plugin: Found %d CPU%s", num_cpu, - (num_cpu == 1) ? "" : "s"); +static void cpufreq_submit(int cpu_num, value_t value) { + value_list_t vl = VALUE_LIST_INIT; - if (num_cpu == 0) - plugin_unregister_read ("cpufreq"); -#endif /* defined(KERNEL_LINUX) */ + vl.values = &value; + vl.values_len = 1; + sstrncpy(vl.plugin, "cpufreq", sizeof(vl.plugin)); + sstrncpy(vl.type, "cpufreq", sizeof(vl.type)); + snprintf(vl.type_instance, sizeof(vl.type_instance), "%i", cpu_num); - return (0); -} /* int cpufreq_init */ + plugin_dispatch_values(&vl); +} -static void cpufreq_submit (int cpu_num, double value) -{ - value_t values[1]; - value_list_t vl = VALUE_LIST_INIT; +static int cpufreq_read(void) { + for (int i = 0; i < num_cpu; i++) { + char filename[PATH_MAX]; + snprintf(filename, sizeof(filename), + "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_cur_freq", i); - values[0].gauge = value; + value_t v; + if (parse_value_file(filename, &v, DS_TYPE_GAUGE) != 0) { + WARNING("cpufreq plugin: Reading \"%s\" failed.", filename); + continue; + } - vl.values = values; - 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); + /* convert kHz to Hz */ + v.gauge *= 1000.0; - plugin_dispatch_values ("cpufreq", &vl); -} + cpufreq_submit(i, v); + } -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++) - { - 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) - { - syslog (LOG_WARNING, "cpufreq: fopen: %s", strerror (errno)); - return (-1); - } - - if (fgets (buffer, 16, fp) == NULL) - { - syslog (LOG_WARNING, "cpufreq: fgets: %s", strerror (errno)); - fclose (fp); - return (-1); - } - - if (fclose (fp)) - syslog (LOG_WARNING, "cpufreq: fclose: %s", strerror (errno)); - - /* You're seeing correctly: The file is reporting kHz values.. */ - val = atoll (buffer) * 1000; - - cpufreq_submit (i, val); - } -#endif /* defined(KERNEL_LINUX) */ - - return (0); + return 0; } /* int cpufreq_read */ -#endif /* CPUFREQ_HAVE_READ */ -#undef BUFSIZE - -void module_register (void) -{ - plugin_register_data_set (&data_set); -#if CPUFREQ_HAVE_READ - plugin_register_init ("cpufreq", cpufreq_init); - plugin_register_read ("cpufreq", cpufreq_read); -#endif /* CPUFREQ_HAVE_READ */ +void module_register(void) { + plugin_register_init("cpufreq", cpufreq_init); + plugin_register_read("cpufreq", cpufreq_read); }