Code

src/plugin.c: Free the "data_sets" AVL tree.
authorFlorian Forster <octo@collectd.org>
Sat, 13 Jul 2013 06:20:28 +0000 (08:20 +0200)
committerFlorian Forster <octo@collectd.org>
Sat, 13 Jul 2013 06:20:28 +0000 (08:20 +0200)
This pops up every time I investigate memory leaks and it's annoying me.

src/plugin.c

index 809c140f7e0d1ee8f9047e39d5a7c17eed4cac8a..b0c82e397c4e7cd6aebf052d77b3b8489d6d57d0 100644 (file)
@@ -939,6 +939,27 @@ int plugin_register_shutdown (const char *name,
                                (void *) callback, /* user_data = */ NULL));
 } /* int plugin_register_shutdown */
 
+static void plugin_free_data_sets (void)
+{
+       void *key;
+       void *value;
+
+       if (data_sets == NULL)
+               return;
+
+       while (c_avl_pick (data_sets, &key, &value) == 0)
+       {
+               data_set_t *ds = value;
+               /* key is a pointer to ds->type */
+
+               sfree (ds->ds);
+               sfree (ds);
+       }
+
+       c_avl_destroy (data_sets);
+       data_sets = NULL;
+} /* void plugin_free_data_sets */
+
 int plugin_register_data_set (const data_set_t *ds)
 {
        data_set_t *ds_copy;
@@ -1450,6 +1471,8 @@ void plugin_shutdown_all (void)
        destroy_all_callbacks (&list_notification);
        destroy_all_callbacks (&list_shutdown);
        destroy_all_callbacks (&list_log);
+
+       plugin_free_data_sets ();
 } /* void plugin_shutdown_all */
 
 int plugin_dispatch_missing (const value_list_t *vl) /* {{{ */