]> git.ipfire.org Git - thirdparty/collectd.git/commitdiff
write_tsdb plugin: Implement reference counting.
authorFlorian Forster <octo@collectd.org>
Wed, 29 Nov 2023 12:55:20 +0000 (13:55 +0100)
committerFlorian Forster <octo@collectd.org>
Tue, 12 Dec 2023 09:51:32 +0000 (10:51 +0100)
src/write_tsdb.c

index a3a480d6ca50de583d811e9c0c72875a565fc62b..c8303888a120ff02376fb49578a6e01f52e8fa51 100644 (file)
@@ -92,6 +92,8 @@ struct wt_callback {
   bool connect_failed_log_enabled;
   int connect_dns_failed_attempts_remaining;
   cdtime_t next_random_ttl;
+
+  int reference_count;
 };
 
 static cdtime_t resolve_interval;
@@ -259,14 +261,17 @@ static int wt_callback_init(struct wt_callback *cb) {
 }
 
 static void wt_callback_free(void *data) {
-  struct wt_callback *cb;
-
   if (data == NULL)
     return;
 
-  cb = data;
+  struct wt_callback *cb = data;
 
   pthread_mutex_lock(&cb->send_lock);
+  cb->reference_count--;
+  if (cb->reference_count > 0) {
+    pthread_mutex_unlock(&cb->send_lock);
+    return;
+  }
 
   wt_flush_nolock(0, cb);
 
@@ -608,11 +613,15 @@ static int wt_config_tsd(oconfig_item_t *ci) {
            cb->node != NULL ? cb->node : WT_DEFAULT_NODE,
            cb->service != NULL ? cb->service : WT_DEFAULT_SERVICE);
 
-  user_data_t user_data = {.data = cb, .free_func = wt_callback_free};
+  user_data_t user_data = {
+      .data = cb,
+      .free_func = wt_callback_free,
+  };
 
+  cb->reference_count++;
   plugin_register_write(callback_name, wt_write, &user_data);
 
-  user_data.free_func = NULL;
+  cb->reference_count++;
   plugin_register_flush(callback_name, wt_flush, &user_data);
 
   return 0;