X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fplugin.c;h=fdc0425b25d393bb23d02542e2b383fff99a4298;hb=3f2f61c7d74d9204405a4b0c21390451c98665a7;hp=0570f0ee0dc37269ce66fb724fe7f6abd64ac7dc;hpb=bc0a8f260e4e24bdf664c3dcff919b6f99bfe31d;p=collectd.git diff --git a/src/plugin.c b/src/plugin.c index 0570f0ee..fdc0425b 100644 --- a/src/plugin.c +++ b/src/plugin.c @@ -1,6 +1,6 @@ /** * collectd - src/plugin.c - * Copyright (C) 2005,2006 Florian octo Forster + * Copyright (C) 2005-2008 Florian octo Forster * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -17,6 +17,7 @@ * * Authors: * Florian octo Forster + * Sebastian Harl **/ #include "collectd.h" @@ -53,6 +54,7 @@ typedef struct read_func_s read_func_t; static llist_t *list_init; static llist_t *list_read; static llist_t *list_write; +static llist_t *list_flush; static llist_t *list_shutdown; static llist_t *list_log; static llist_t *list_notification; @@ -146,14 +148,14 @@ static int plugin_load_file (char *file) { const char *error = lt_dlerror (); - ERROR ("lt_dlopen failed: %s", error); - fprintf (stderr, "lt_dlopen failed: %s\n", error); + ERROR ("lt_dlopen (%s) failed: %s", file, error); + fprintf (stderr, "lt_dlopen (%s) failed: %s\n", file, error); return (1); } if ((reg_handle = (void (*) (void)) lt_dlsym (dlh, "module_register")) == NULL) { - WARNING ("Couldn't find symbol ``module_register'' in ``%s'': %s\n", + WARNING ("Couldn't find symbol `module_register' in `%s': %s\n", file, lt_dlerror ()); lt_dlclose (dlh); return (-1); @@ -312,7 +314,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; @@ -379,6 +381,9 @@ int plugin_load (const char *type) closedir (dh); + if (filename[0] == '\0') + fprintf (stderr, "Could not find plugin %s.\n", type); + return (ret); } @@ -434,6 +439,11 @@ int plugin_register_write (const char *name, return (register_callback (&list_write, name, (void *) callback)); } /* int plugin_register_write */ +int plugin_register_flush (const char *name, int (*callback) (const int)) +{ + return (register_callback (&list_flush, name, (void *) callback)); +} /* int plugin_register_flush */ + int plugin_register_shutdown (char *name, int (*callback) (void)) { @@ -528,6 +538,11 @@ int plugin_unregister_write (const char *name) return (plugin_unregister (list_write, name)); } +int plugin_unregister_flush (const char *name) +{ + return (plugin_unregister (list_flush, name)); +} + int plugin_unregister_shutdown (const char *name) { return (plugin_unregister (list_shutdown, name)); @@ -565,22 +580,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) { @@ -593,12 +601,25 @@ 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 (void) @@ -640,6 +661,43 @@ void plugin_read_all (void) pthread_mutex_unlock (&read_lock); } /* void plugin_read_all */ +int plugin_flush_one (int timeout, const char *name) +{ + int (*callback) (int); + llentry_t *le; + int status; + + if (list_flush == NULL) + return (-1); + + le = llist_search (list_flush, name); + if (le == NULL) + return (-1); + callback = (int (*) (int)) le->value; + + status = (*callback) (timeout); + + return (status); +} /* int plugin_flush_ont */ + +void plugin_flush_all (int timeout) +{ + int (*callback) (int); + llentry_t *le; + + if (list_flush == NULL) + return; + + le = llist_head (list_flush); + while (le != NULL) + { + callback = (int (*) (int)) le->value; + le = le->next; + + (*callback) (timeout); + } +} /* void plugin_flush_all */ + void plugin_shutdown_all (void) { int (*callback) (void); @@ -671,16 +729,29 @@ int plugin_dispatch_values (const char *name, value_list_t *vl) data_set_t *ds; llentry_t *le; - if ((list_write == NULL) || (data_sets == 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); + } + + if (data_sets == NULL) + { + ERROR ("plugin_dispatch_values: No data sets registered. " + "Could the types database be read? Check " + "your `TypesDB' setting!"); return (-1); + } if (c_avl_get (data_sets, name, (void *) &ds) != 0) { - DEBUG ("No such dataset registered: %s", name); + 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;", @@ -694,7 +765,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);