X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fplugin.c;h=cd7b10834c4559f8e456ef8e6efe20bdf51f4271;hb=bc7992ed0693313a2b1fe282a5bf23f1cc9f8e42;hp=465e2899ace67a57f0b50d91532e2a7f224682dd;hpb=65954d9b90c905e74f174d2dacba102b6fe540c6;p=collectd.git diff --git a/src/plugin.c b/src/plugin.c index 465e2899..cd7b1083 100644 --- a/src/plugin.c +++ b/src/plugin.c @@ -1,6 +1,6 @@ /** * collectd - src/plugin.c - * Copyright (C) 2005-2008 Florian octo Forster + * Copyright (C) 2005-2009 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 @@ -62,6 +62,9 @@ static llist_t *list_shutdown; static llist_t *list_log; static llist_t *list_notification; +static fc_chain_t *pre_cache_chain = NULL; +static fc_chain_t *post_cache_chain = NULL; + static c_avl_tree_t *data_sets; static char *plugindir = NULL; @@ -276,6 +279,9 @@ static void stop_threads (void) { int i; + if (read_threads == NULL) + return; + pthread_mutex_lock (&read_lock); read_loop = 0; DEBUG ("plugin: stop_threads: Signalling `read_cond'"); @@ -593,6 +599,7 @@ int plugin_unregister_notification (const char *name) void plugin_init_all (void) { + const char *chain_name; int (*callback) (void); llentry_t *le; int status; @@ -600,6 +607,13 @@ void plugin_init_all (void) /* Init the value cache */ uc_init (); + chain_name = global_option_get ("PreCacheChain"); + pre_cache_chain = fc_chain_get_by_name (chain_name); + + chain_name = global_option_get ("PostCacheChain"); + post_cache_chain = fc_chain_get_by_name (chain_name); + + if ((list_init == NULL) && (list_read == NULL)) return; @@ -635,7 +649,8 @@ void plugin_init_all (void) int num; rt = global_option_get ("ReadThreads"); num = atoi (rt); - start_threads ((num > 0) ? num : 5); + if (num != -1) + start_threads ((num > 0) ? num : 5); } } /* void plugin_init_all */ @@ -678,6 +693,37 @@ void plugin_read_all (void) pthread_mutex_unlock (&read_lock); } /* void plugin_read_all */ +/* Read function called when the `-T' command line argument is given. */ +int plugin_read_all_once (void) +{ + llentry_t *le; + read_func_t *rf; + int status; + int return_status = 0; + + if (list_read == NULL) + { + NOTICE ("No read-functions are registered."); + return (0); + } + + for (le = llist_head (list_read); + le != NULL; + le = le->next) + { + rf = (read_func_t *) le->value; + status = rf->callback (); + if (status != 0) + { + NOTICE ("read-function of plugin `%s' failed.", + le->key); + return_status = -1; + } + } + + return (return_status); +} /* int plugin_read_all_once */ + int plugin_write (const char *plugin, /* {{{ */ const data_set_t *ds, const value_list_t *vl) { @@ -798,6 +844,7 @@ void plugin_shutdown_all (void) int plugin_dispatch_values (value_list_t *vl) { + int status; static c_complain_t no_write_complaint = C_COMPLAIN_INIT_STATIC; data_set_t *ds; @@ -827,6 +874,9 @@ int plugin_dispatch_values (value_list_t *vl) return (-1); } + if (vl->time == 0) + vl->time = time (NULL); + DEBUG ("plugin_dispatch_values: time = %u; interval = %i; " "host = %s; " "plugin = %s; plugin_instance = %s; " @@ -863,10 +913,36 @@ int plugin_dispatch_values (value_list_t *vl) escape_slashes (vl->type, sizeof (vl->type)); escape_slashes (vl->type_instance, sizeof (vl->type_instance)); + if (pre_cache_chain != NULL) + { + status = fc_process_chain (ds, vl, pre_cache_chain); + if (status < 0) + { + WARNING ("plugin_dispatch_values: Running the " + "pre-cache chain failed with " + "status %i (%#x).", + status, status); + } + else if (status == FC_TARGET_STOP) + return (0); + } + /* Update the value cache */ uc_update (ds, vl); - fc_process (ds, vl); + if (post_cache_chain != NULL) + { + status = fc_process_chain (ds, vl, post_cache_chain); + if (status < 0) + { + WARNING ("plugin_dispatch_values: Running the " + "post-cache chain failed with " + "status %i (%#x).", + status, status); + } + } + else + fc_default_action (ds, vl); return (0); } /* int plugin_dispatch_values */ @@ -971,8 +1047,8 @@ static int plugin_notification_meta_add (notification_t *n, { case NM_TYPE_STRING: { - meta->value_string = strdup ((const char *) value); - if (meta->value_string == NULL) + meta->nm_value.nm_string = strdup ((const char *) value); + if (meta->nm_value.nm_string == NULL) { ERROR ("plugin_notification_meta_add: strdup failed."); sfree (meta); @@ -982,22 +1058,22 @@ static int plugin_notification_meta_add (notification_t *n, } case NM_TYPE_SIGNED_INT: { - meta->value_signed_int = *((int64_t *) value); + meta->nm_value.nm_signed_int = *((int64_t *) value); break; } case NM_TYPE_UNSIGNED_INT: { - meta->value_unsigned_int = *((uint64_t *) value); + meta->nm_value.nm_unsigned_int = *((uint64_t *) value); break; } case NM_TYPE_DOUBLE: { - meta->value_double = *((double *) value); + meta->nm_value.nm_double = *((double *) value); break; } case NM_TYPE_BOOLEAN: { - meta->value_boolean = *((bool *) value); + meta->nm_value.nm_boolean = *((bool *) value); break; } default: @@ -1070,19 +1146,19 @@ int plugin_notification_meta_copy (notification_t *dst, { if (meta->type == NM_TYPE_STRING) plugin_notification_meta_add_string (dst, meta->name, - meta->value_string); + meta->nm_value.nm_string); else if (meta->type == NM_TYPE_SIGNED_INT) plugin_notification_meta_add_signed_int (dst, meta->name, - meta->value_signed_int); + meta->nm_value.nm_signed_int); else if (meta->type == NM_TYPE_UNSIGNED_INT) plugin_notification_meta_add_unsigned_int (dst, meta->name, - meta->value_unsigned_int); + meta->nm_value.nm_unsigned_int); else if (meta->type == NM_TYPE_DOUBLE) plugin_notification_meta_add_double (dst, meta->name, - meta->value_double); + meta->nm_value.nm_double); else if (meta->type == NM_TYPE_BOOLEAN) plugin_notification_meta_add_boolean (dst, meta->name, - meta->value_boolean); + meta->nm_value.nm_boolean); } return (0); @@ -1107,8 +1183,8 @@ int plugin_notification_meta_free (notification_t *n) if (this->type == NM_TYPE_STRING) { - free ((char *)this->value_string); - this->value_string = NULL; + free ((char *)this->nm_value.nm_string); + this->nm_value.nm_string = NULL; } sfree (this);