X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fplugin.c;h=1dd6daf33a9963ef18a897fc5e4221308c3ba80e;hb=a00feb12d82ae2f46db99d0336b955f387f7f354;hp=7cf54c375ca52f269cf090d284950ef72c56ae86;hpb=e3f63afc6fc07e04540a42e69bdeab4928f1cd49;p=collectd.git diff --git a/src/plugin.c b/src/plugin.c index 7cf54c37..1dd6daf3 100644 --- a/src/plugin.c +++ b/src/plugin.c @@ -30,6 +30,7 @@ #include "common.h" #include "plugin.h" #include "configfile.h" +#include "utils_avltree.h" #include "utils_llist.h" #include "utils_cache.h" #include "utils_threshold.h" @@ -53,10 +54,11 @@ static llist_t *list_init; static llist_t *list_read; static llist_t *list_write; static llist_t *list_shutdown; -static llist_t *list_data_set; static llist_t *list_log; static llist_t *list_notification; +static c_avl_tree_t *data_sets; + static char *plugindir = NULL; static int read_loop = 1; @@ -79,6 +81,7 @@ static const char *plugin_get_dir (void) static int register_callback (llist_t **list, const char *name, void *callback) { llentry_t *le; + char *key; if ((*list == NULL) && ((*list = llist_create ()) == NULL)) @@ -87,9 +90,16 @@ static int register_callback (llist_t **list, const char *name, void *callback) le = llist_search (*list, name); if (le == NULL) { - le = llentry_create (name, callback); + key = strdup (name); + if (key == NULL) + return (-1); + + le = llentry_create (key, callback); if (le == NULL) + { + free (key); return (-1); + } llist_append (*list, le); } @@ -111,6 +121,7 @@ static int plugin_unregister (llist_t *list, const char *name) return (-1); llist_remove (list, e); + free (e->key); llentry_destroy (e); return (0); @@ -433,12 +444,18 @@ int plugin_register_data_set (const data_set_t *ds) data_set_t *ds_copy; int i; - if ((list_data_set != NULL) - && (llist_search (list_data_set, ds->type) != NULL)) + if ((data_sets != NULL) + && (c_avl_get (data_sets, ds->type, NULL) == 0)) { NOTICE ("Replacing DS `%s' with another version.", ds->type); plugin_unregister_data_set (ds->type); } + else if (data_sets == NULL) + { + data_sets = c_avl_create ((int (*) (const void *, const void *)) strcmp); + if (data_sets == NULL) + return (-1); + } ds_copy = (data_set_t *) malloc (sizeof (data_set_t)); if (ds_copy == NULL) @@ -456,7 +473,7 @@ int plugin_register_data_set (const data_set_t *ds) for (i = 0; i < ds->ds_num; i++) memcpy (ds_copy->ds + i, ds->ds + i, sizeof (data_source_t)); - return (register_callback (&list_data_set, ds->type, (void *) ds_copy)); + return (c_avl_insert (data_sets, (void *) ds_copy->type, (void *) ds_copy)); } /* int plugin_register_data_set */ int plugin_register_log (char *name, @@ -468,7 +485,7 @@ int plugin_register_log (char *name, int plugin_register_notification (const char *name, int (*callback) (const notification_t *notif)) { - return (register_callback (&list_log, name, (void *) callback)); + return (register_callback (&list_notification, name, (void *) callback)); } /* int plugin_register_log */ int plugin_unregister_config (const char *name) @@ -499,6 +516,7 @@ int plugin_unregister_read (const char *name) llist_remove (list_read, e); free (e->value); + free (e->key); llentry_destroy (e); return (0); @@ -516,21 +534,14 @@ int plugin_unregister_shutdown (const char *name) int plugin_unregister_data_set (const char *name) { - llentry_t *e; data_set_t *ds; - if (list_data_set == NULL) + if (data_sets == NULL) return (-1); - e = llist_search (list_data_set, name); - - if (e == NULL) + if (c_avl_remove (data_sets, name, NULL, (void *) &ds) != 0) return (-1); - llist_remove (list_data_set, e); - ds = (data_set_t *) e->value; - llentry_destroy (e); - sfree (ds->ds); sfree (ds); @@ -589,11 +600,13 @@ void plugin_init_all (void) } } /* void plugin_init_all */ -void plugin_read_all (const int *loop) +void plugin_read_all (void) { llentry_t *le; read_func_t *rf; + uc_check_timeout (); + if (list_read == NULL) return; @@ -657,18 +670,15 @@ int plugin_dispatch_values (const char *name, value_list_t *vl) data_set_t *ds; llentry_t *le; - if ((list_write == NULL) || (list_data_set == NULL)) + if ((list_write == NULL) || (data_sets == NULL)) return (-1); - le = llist_search (list_data_set, name); - if (le == NULL) + if (c_avl_get (data_sets, name, (void *) &ds) != 0) { DEBUG ("No such dataset registered: %s", name); return (-1); } - ds = (data_set_t *) le->value; - DEBUG ("plugin: plugin_dispatch_values: time = %u; interval = %i; " "host = %s; " "plugin = %s; plugin_instance = %s; " @@ -772,16 +782,12 @@ void plugin_log (int level, const char *format, ...) const data_set_t *plugin_get_ds (const char *name) { data_set_t *ds; - llentry_t *le; - le = llist_search (list_data_set, name); - if (le == NULL) + if (c_avl_get (data_sets, name, (void *) &ds) != 0) { DEBUG ("No such dataset registered: %s", name); return (NULL); } - ds = (data_set_t *) le->value; - return (ds); } /* data_set_t *plugin_get_ds */