Turbostat: Explain why _GNU_SOURCE is required
[collectd.git] / src / turbostat.c
index ad60f31..9337e90 100644 (file)
  * Ported to collectd by Vincent Brillault <git@lerya.net>
  */
 
+/*
+ * _GNU_SOURCE is required because of the following functions:
+ * - CPU_ISSET_S
+ * - CPU_ZERO_S
+ * - CPU_SET_S
+ * - CPU_FREE
+ * - CPU_ALLOC
+ * - CPU_ALLOC_SIZE
+ */
 #define _GNU_SOURCE
+
 #include <asm/msr-index.h>
 #include <stdarg.h>
 #include <stdio.h>
@@ -51,7 +61,6 @@
 #define PLUGIN_NAME "turbostat"
 
 static const char *proc_stat = "/proc/stat";
-static unsigned int interval_sec = 5;  /* set with -i interval_sec */
 static unsigned int skip_c0;
 static unsigned int skip_c1;
 static unsigned int do_nhm_cstates;
@@ -212,8 +221,6 @@ enum return_values {
        ERR_NOT_ROOT,
 };
 
-#define __must_check __attribute__((warn_unused_result))
-
 static int setup_all_buffers(void);
 
 static int
@@ -226,7 +233,7 @@ cpu_is_not_present(int cpu)
  * skip non-present cpus
  */
 
-static int __must_check
+static int __attribute__((warn_unused_result))
 for_all_cpus(int (func)(struct thread_data *, struct core_data *, struct pkg_data *),
        struct thread_data *thread_base, struct core_data *core_base, struct pkg_data *pkg_base)
 {
@@ -257,7 +264,7 @@ for_all_cpus(int (func)(struct thread_data *, struct core_data *, struct pkg_dat
        return 0;
 }
 
-static int __must_check
+static int __attribute__((warn_unused_result))
 cpu_migrate(int cpu)
 {
        CPU_ZERO_S(cpu_affinity_setsize, cpu_affinity_set);
@@ -268,14 +275,14 @@ cpu_migrate(int cpu)
                return 0;
 }
 
-static int __must_check
+static int __attribute__((warn_unused_result))
 get_msr(int cpu, off_t offset, unsigned long long *msr)
 {
        ssize_t retval;
        char pathname[32];
        int fd;
 
-       sprintf(pathname, "/dev/cpu/%d/msr", cpu);
+       ssnprintf(pathname, 32, "/dev/cpu/%d/msr", cpu);
        fd = open(pathname, O_RDONLY);
        if (fd < 0)
                return -1;
@@ -330,7 +337,7 @@ delta_core(struct core_data *new, struct core_data *old)
 /*
  * old = new - old
  */
-static int __must_check
+static int __attribute__((warn_unused_result))
 delta_thread(struct thread_data *new, struct thread_data *old,
        struct core_data *core_delta)
 {
@@ -391,7 +398,7 @@ delta_thread(struct thread_data *new, struct thread_data *old,
        return 0;
 }
 
-static int __must_check
+static int __attribute__((warn_unused_result))
 delta_cpu(struct thread_data *t, struct core_data *c,
        struct pkg_data *p, struct thread_data *t2,
        struct core_data *c2, struct pkg_data *p2)
@@ -430,7 +437,7 @@ rdtsc(void)
  * migrate to cpu
  * acquire and record local counters for that cpu
  */
-static int __must_check
+static int __attribute__((warn_unused_result))
 get_counters(struct thread_data *t, struct core_data *c, struct pkg_data *p)
 {
        int cpu = t->cpu_id;
@@ -577,7 +584,7 @@ free_all_buffers(void)
 /*
  * Parse a file containing a single int.
  */
-static int
+static int __attribute__ ((format(printf,1,2)))
 parse_int_file(const char *fmt, ...)
 {
        va_list args;
@@ -642,7 +649,7 @@ get_num_ht_siblings(int cpu)
        int matches;
        char character;
 
-       sprintf(path, "/sys/devices/system/cpu/cpu%d/topology/thread_siblings_list", cpu);
+       ssnprintf(path, 80, "/sys/devices/system/cpu/cpu%d/topology/thread_siblings_list", cpu);
        filep = fopen(path, "r");
         if (!filep) {
                 ERROR("%s: open failed", path);
@@ -669,7 +676,7 @@ get_num_ht_siblings(int cpu)
  */
 
 
-static int __must_check
+static int __attribute__((warn_unused_result))
 for_all_cpus_2(int (func)(struct thread_data *, struct core_data *,
        struct pkg_data *, struct thread_data *, struct core_data *,
        struct pkg_data *), struct thread_data *thread_base,
@@ -713,7 +720,7 @@ for_all_cpus_2(int (func)(struct thread_data *, struct core_data *,
  * run func(cpu) on every cpu in /proc/stat
  * return max_cpu number
  */
-static int __must_check
+static int __attribute__((warn_unused_result))
 for_all_proc_cpus(int (func)(int))
 {
        FILE *fp;
@@ -937,7 +944,7 @@ turbostat_read(user_data_t * not_used)
        return 0;
 }
 
-static int __must_check
+static int __attribute__((warn_unused_result))
 check_dev_msr()
 {
        struct stat sb;
@@ -950,7 +957,7 @@ check_dev_msr()
        return 0;
 }
 
-static int __must_check
+static int __attribute__((warn_unused_result))
 check_super_user()
 {
        if (getuid() != 0) {
@@ -1108,7 +1115,7 @@ is_slm(unsigned int family, unsigned int model)
  * below this value, including the Digital Thermal Sensor (DTS),
  * Package Thermal Management Sensor (PTM), and thermal event thresholds.
  */
-static int __must_check
+static int __attribute__((warn_unused_result))
 set_temperature_target(struct thread_data *t, struct core_data *c, struct pkg_data *p)
 {
        unsigned long long msr;
@@ -1160,7 +1167,7 @@ guess:
        return 0;
 }
 
-static int __must_check
+static int __attribute__((warn_unused_result))
 check_cpuid()
 {
        unsigned int eax, ebx, ecx, edx, max_level;
@@ -1240,7 +1247,7 @@ check_cpuid()
 
 
 
-static int __must_check
+static int __attribute__((warn_unused_result))
 topology_probe()
 {
        int i;
@@ -1482,7 +1489,6 @@ static int
 turbostat_init(void)
 {
        int ret;
-       struct timespec ts;
 
        DO_OR_GOTO_ERR(check_cpuid());
        DO_OR_GOTO_ERR(check_dev_msr());
@@ -1490,10 +1496,7 @@ turbostat_init(void)
        DO_OR_GOTO_ERR(setup_all_buffers());
        DO_OR_GOTO_ERR(for_all_cpus(set_temperature_target, EVEN_COUNTERS));
 
-       ts.tv_sec = interval_sec;
-       ts.tv_nsec = 0;
-
-       plugin_register_complex_read(NULL, PLUGIN_NAME, turbostat_read, &ts, NULL);
+       plugin_register_complex_read(NULL, PLUGIN_NAME, turbostat_read, NULL, NULL);
 
        return 0;
 err:
@@ -1501,25 +1504,8 @@ err:
        return ret;
 }
 
-static const char *config_keys[] =
-{
-       "Interval",
-};
-static int config_keys_num = STATIC_ARRAY_SIZE (config_keys);
-
-static int
-turbostat_config(const char *key, const char *value)
-{
-       if (strcasecmp("Interval", key) == 0)
-               interval_sec = atoi(value);
-       else
-               return -1;
-       return 0;
-}
-
 void module_register(void);
 void module_register(void)
 {
        plugin_register_init(PLUGIN_NAME, turbostat_init);
-       plugin_register_config(PLUGIN_NAME, turbostat_config, config_keys, config_keys_num);
 }