X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fplugin.c;h=f1333f1d43ce8fa8a347d8fc0e112479615f1563;hb=7699c3ec722a9414f3342d6cd31b7be440a5da6f;hp=b24707a09e3c791ac99957ea1dbf2114252055b8;hpb=79dab1613955126520ab36e772f0afb596fd51dc;p=collectd.git diff --git a/src/plugin.c b/src/plugin.c index b24707a0..f1333f1d 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; @@ -232,6 +234,7 @@ static void *plugin_read_thread (void *args) pthread_mutex_unlock (&read_lock); pthread_exit (NULL); + return ((void *) 0); } /* void *plugin_read_thread */ static void start_threads (int num) @@ -309,7 +312,7 @@ int plugin_load (const char *type) { DIR *dh; const char *dir; - char filename[BUFSIZE]; + char filename[BUFSIZE] = ""; char typename[BUFSIZE]; int typename_len; int ret; @@ -376,6 +379,9 @@ int plugin_load (const char *type) closedir (dh); + if (filename[0] == '\0') + fprintf (stderr, "Could not find plugin %s.\n", type); + return (ret); } @@ -442,12 +448,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) @@ -465,7 +477,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, @@ -477,7 +489,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) @@ -526,22 +538,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; - free (e->key); - llentry_destroy (e); - sfree (ds->ds); sfree (ds); @@ -564,22 +568,15 @@ void plugin_init_all (void) llentry_t *le; int status; - /* Start read-threads */ - if (list_read != NULL) - { - const char *rt; - int num; - rt = global_option_get ("ReadThreads"); - num = atoi (rt); - start_threads ((num > 0) ? num : 5); - } - /* Init the value cache */ uc_init (); - if (list_init == NULL) + if ((list_init == NULL) && (list_read == NULL)) return; + /* Calling all init callbacks before checking if read callbacks + * are available allows the init callbacks to register the read + * callback. */ le = llist_head (list_init); while (le != NULL) { @@ -592,15 +589,28 @@ void plugin_init_all (void) "failed with status %i. " "Plugin will be unloaded.", le->key, status); + /* Plugins that register read callbacks from the init + * callback should take care of appropriate error + * handling themselves. */ /* FIXME: Unload _all_ functions */ plugin_unregister_read (le->key); } le = le->next; } + + /* Start read-threads */ + if (list_read != NULL) + { + const char *rt; + int num; + rt = global_option_get ("ReadThreads"); + num = atoi (rt); + start_threads ((num > 0) ? num : 5); + } } /* void plugin_init_all */ -void plugin_read_all (const int *loop) +void plugin_read_all (void) { llentry_t *le; read_func_t *rf; @@ -670,19 +680,29 @@ 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) + { + ERROR ("plugin_dispatch_values: No write callback has been " + "registered. Please load at least one plugin " + "that provides a write function."); return (-1); + } - le = llist_search (list_data_set, name); - if (le == NULL) + if (data_sets == NULL) { - DEBUG ("No such dataset registered: %s", name); + ERROR ("plugin_dispatch_values: No data sets registered. " + "Could the types database be read? Check " + "your `TypesDB' setting!"); return (-1); } - ds = (data_set_t *) le->value; + if (c_avl_get (data_sets, name, (void *) &ds) != 0) + { + INFO ("plugin_dispatch_values: Dataset not found: %s", name); + return (-1); + } - DEBUG ("plugin: plugin_dispatch_values: time = %u; interval = %i; " + DEBUG ("plugin_dispatch_values: time = %u; interval = %i; " "host = %s; " "plugin = %s; plugin_instance = %s; " "type = %s; type_instance = %s;", @@ -696,7 +716,8 @@ int plugin_dispatch_values (const char *name, value_list_t *vl) #else if (ds->ds_num != vl->values_len) { - ERROR ("plugin: ds->type = %s: (ds->ds_num = %i) != " + ERROR ("plugin_dispatch_values: ds->type = %s: " + "(ds->ds_num = %i) != " "(vl->values_len = %i)", ds->type, ds->ds_num, vl->values_len); return (-1); @@ -785,16 +806,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 */