Code

rrdcached plugin: Register write/flush only if DaemonAddress has been given.
authorSebastian Harl <sh@tokkee.org>
Fri, 17 Jun 2011 08:25:48 +0000 (10:25 +0200)
committerSebastian Harl <sh@tokkee.org>
Fri, 17 Jun 2011 08:25:48 +0000 (10:25 +0200)
Else, the write callback would remove itself on the first call. This
operation, however, is not thread-safe as access to the write list is not
synchronized. Thus, removing the callback at that point leads to random
segfaults.

src/rrdcached.c

index a392715616ff7fb501cc8294db0461a9412bb62a..f53ccad7ab5bac6f4a121d35459bfa461f6e31d7 100644 (file)
@@ -49,6 +49,14 @@ static rrdcreate_config_t rrdcreate_config =
        /* consolidation_functions_num = */ 0
 };
 
+/*
+ * Prototypes.
+ */
+static int rc_write (const data_set_t *ds, const value_list_t *vl,
+    user_data_t __attribute__((unused)) *user_data);
+static int rc_flush (__attribute__((unused)) cdtime_t timeout,
+    const char *identifier, __attribute__((unused)) user_data_t *ud);
+
 static int value_list_to_string (char *buffer, int buffer_len,
     const data_set_t *ds, const value_list_t *vl)
 {
@@ -227,6 +235,11 @@ static int rc_config (oconfig_item_t *ci)
       continue;
     }
   }
+
+  if (daemon_address != NULL) {
+    plugin_register_write ("rrdcached", rc_write, /* user_data = */ NULL);
+    plugin_register_flush ("rrdcached", rc_flush, /* user_data = */ NULL);
+  }
   return (0);
 } /* int rc_config */
 
@@ -466,8 +479,6 @@ void module_register (void)
 {
   plugin_register_complex_config ("rrdcached", rc_config);
   plugin_register_init ("rrdcached", rc_init);
-  plugin_register_write ("rrdcached", rc_write, /* user_data = */ NULL);
-  plugin_register_flush ("rrdcached", rc_flush, /* user_data = */ NULL);
   plugin_register_shutdown ("rrdcached", rc_shutdown);
 } /* void module_register */