X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fdaemon%2Fplugin.c;h=0919bdfe10a7fd459f79e6789653fecb3e5e2bd2;hb=441e067a2d5a294517bd87ca45c87fd67377d2cf;hp=be3f03fc57d5a7d1a68a4fd0b831543f44b6f03f;hpb=8eb05d21637cd1eb3b6c4c4d3ed519cc2fd3ebf6;p=collectd.git diff --git a/src/daemon/plugin.c b/src/daemon/plugin.c index be3f03fc..fa78fa02 100644 --- a/src/daemon/plugin.c +++ b/src/daemon/plugin.c @@ -288,7 +288,7 @@ static int register_callback (llist_t **list, /* {{{ */ { ERROR ("plugin: register_callback: " "llentry_create failed."); - free (key); + sfree (key); destroy_callback (cf); return (-1); } @@ -358,9 +358,9 @@ static void log_list_callbacks (llist_t **list, /* {{{ */ *str = '\0'; strjoin(str, len, keys, n, "', '"); INFO("%s ['%s']", comment, str); - free(str); + sfree (str); } - free(keys); + sfree (keys); } /* }}} void log_list_callbacks */ static int create_register_callback (llist_t **list, /* {{{ */ @@ -368,13 +368,12 @@ static int create_register_callback (llist_t **list, /* {{{ */ { callback_func_t *cf; - cf = (callback_func_t *) malloc (sizeof (*cf)); + cf = calloc (1, sizeof (*cf)); if (cf == NULL) { - ERROR ("plugin: create_register_callback: malloc failed."); + ERROR ("plugin: create_register_callback: calloc failed."); return (-1); } - memset (cf, 0, sizeof (*cf)); cf->cf_callback = callback; if (ud == NULL) @@ -483,7 +482,9 @@ static void *plugin_read_thread (void __attribute__((unused)) *args) { read_func_t *rf; plugin_ctx_t old_ctx; + cdtime_t start; cdtime_t now; + cdtime_t elapsed; int status; int rf_type; int rc; @@ -562,6 +563,8 @@ static void *plugin_read_thread (void __attribute__((unused)) *args) DEBUG ("plugin_read_thread: Handling `%s'.", rf->rf_name); + start = cdtime (); + old_ctx = plugin_set_ctx (rf->rf_ctx); if (rf_type == RF_SIMPLE) @@ -605,8 +608,22 @@ static void *plugin_read_thread (void __attribute__((unused)) *args) /* update the ``next read due'' field */ now = cdtime (); + /* calculate the time spent in the read function */ + elapsed = (now - start); + + if (elapsed > rf->rf_effective_interval) + WARNING ("plugin_read_thread: read-function of the `%s' plugin took %.3f " + "seconds, which is above its read interval (%.3f seconds). You might " + "want to adjust the `Interval' or `ReadThreads' settings.", + rf->rf_name, CDTIME_T_TO_DOUBLE(elapsed), + CDTIME_T_TO_DOUBLE(rf->rf_effective_interval)); + + DEBUG ("plugin_read_thread: read-function of the `%s' plugin took " + "%.6f seconds.", + rf->rf_name, CDTIME_T_TO_DOUBLE(elapsed)); + DEBUG ("plugin_read_thread: Effective interval of the " - "%s plugin is %.3f seconds.", + "`%s' plugin is %.3f seconds.", rf->rf_name, CDTIME_T_TO_DOUBLE (rf->rf_effective_interval)); @@ -623,7 +640,7 @@ static void *plugin_read_thread (void __attribute__((unused)) *args) rf->rf_next_read = now; } - DEBUG ("plugin_read_thread: Next read of the %s plugin at %.3f.", + DEBUG ("plugin_read_thread: Next read of the `%s' plugin at %.3f.", rf->rf_name, CDTIME_T_TO_DOUBLE (rf->rf_next_read)); @@ -941,17 +958,17 @@ static void stop_write_threads (void) /* {{{ */ */ void plugin_set_dir (const char *dir) { - if (plugindir != NULL) - free (plugindir); + sfree (plugindir); if (dir == NULL) - plugindir = NULL; - else if ((plugindir = strdup (dir)) == NULL) { - char errbuf[1024]; - ERROR ("strdup failed: %s", - sstrerror (errno, errbuf, sizeof (errbuf))); + plugindir = NULL; + return; } + + plugindir = strdup (dir); + if (plugindir == NULL) + ERROR ("plugin_set_dir: strdup(\"%s\") failed", dir); } static _Bool plugin_is_loaded (char const *name) @@ -980,7 +997,7 @@ static int plugin_mark_loaded (char const *name) return (status); } -static void plugin_free_loaded () +static void plugin_free_loaded (void) { void *key; void *value; @@ -1089,6 +1106,7 @@ int plugin_load (char const *plugin_name, uint32_t flags) /* success */ plugin_mark_loaded (plugin_name); ret = 0; + INFO ("plugin_load: plugin \"%s\" successfully loaded.", plugin_name); break; } else @@ -1225,14 +1243,13 @@ int plugin_register_read (const char *name, read_func_t *rf; int status; - rf = malloc (sizeof (*rf)); + rf = calloc (1, sizeof (*rf)); if (rf == NULL) { - ERROR ("plugin_register_read: malloc failed."); + ERROR ("plugin_register_read: calloc failed."); return (ENOMEM); } - memset (rf, 0, sizeof (read_func_t)); rf->rf_callback = (void *) callback; rf->rf_udata.data = NULL; rf->rf_udata.free_func = NULL; @@ -1259,14 +1276,13 @@ int plugin_register_complex_read (const char *group, const char *name, read_func_t *rf; int status; - rf = malloc (sizeof (*rf)); + rf = calloc (1,sizeof (*rf)); if (rf == NULL) { - ERROR ("plugin_register_complex_read: malloc failed."); + ERROR ("plugin_register_complex_read: calloc failed."); return (ENOMEM); } - memset (rf, 0, sizeof (read_func_t)); rf->rf_callback = (void *) callback; if (group != NULL) sstrncpy (rf->rf_group, group, sizeof (rf->rf_group)); @@ -1318,13 +1334,13 @@ static void plugin_flush_timeout_callback_free (void *data) if (cb == NULL) return; - sfree(cb->name); - sfree(cb); + sfree (cb->name); + sfree (cb); } /* static void plugin_flush_callback_free */ static char *plugin_flush_callback_name (const char *name) { - char *flush_prefix = "flush/"; + const char *flush_prefix = "flush/"; size_t prefix_size; char *flush_name; size_t name_size; @@ -1332,7 +1348,7 @@ static char *plugin_flush_callback_name (const char *name) prefix_size = strlen(flush_prefix); name_size = strlen(name); - flush_name = malloc (sizeof(char) * (name_size + prefix_size + 1)); + flush_name = malloc (name_size + prefix_size + 1); if (flush_name == NULL) { ERROR ("plugin_flush_callback_name: malloc failed."); @@ -1359,18 +1375,17 @@ int plugin_register_flush (const char *name, if (ctx.flush_interval != 0) { char *flush_name; - user_data_t ud; flush_callback_t *cb; flush_name = plugin_flush_callback_name (name); if (flush_name == NULL) return (-1); - cb = malloc(sizeof(flush_callback_t)); + cb = malloc(sizeof (*cb)); if (cb == NULL) { ERROR ("plugin_register_flush: malloc failed."); - sfree(flush_name); + sfree (flush_name); return (-1); } @@ -1378,27 +1393,27 @@ int plugin_register_flush (const char *name, if (cb->name == NULL) { ERROR ("plugin_register_flush: strdup failed."); - sfree(cb); - sfree(flush_name); + sfree (cb); + sfree (flush_name); return (-1); } cb->timeout = ctx.flush_timeout; - ud.data = cb; - ud.free_func = plugin_flush_timeout_callback_free; + ud->data = cb; + ud->free_func = plugin_flush_timeout_callback_free; status = plugin_register_complex_read ( /* group = */ "flush", /* name = */ flush_name, /* callback = */ plugin_flush_timeout_callback, /* interval = */ ctx.flush_interval, - /* user data = */ &ud); + /* user data = */ ud); - sfree(flush_name); + sfree (flush_name); if (status != 0) { - sfree(cb->name); - sfree(cb); + sfree (cb->name); + sfree (cb); return status; } } @@ -1459,16 +1474,16 @@ int plugin_register_data_set (const data_set_t *ds) return (-1); } - ds_copy = (data_set_t *) malloc (sizeof (data_set_t)); + ds_copy = malloc (sizeof (*ds_copy)); if (ds_copy == NULL) return (-1); memcpy(ds_copy, ds, sizeof (data_set_t)); - ds_copy->ds = (data_source_t *) malloc (sizeof (data_source_t) + ds_copy->ds = malloc (sizeof (*ds_copy->ds) * ds->ds_num); if (ds_copy->ds == NULL) { - free (ds_copy); + sfree (ds_copy); return (-1); } @@ -1632,7 +1647,7 @@ int plugin_unregister_flush (const char *name) if (flush_name != NULL) { plugin_unregister_read(flush_name); - sfree(flush_name); + sfree (flush_name); } } @@ -1678,7 +1693,6 @@ int plugin_unregister_notification (const char *name) void plugin_init_all (void) { char const *chain_name; - long write_threads_num; llentry_t *le; int status; @@ -1724,8 +1738,6 @@ void plugin_init_all (void) write_threads_num = 5; } - start_write_threads ((size_t) write_threads_num); - if ((list_init == NULL) && (read_heap == NULL)) return; @@ -1761,6 +1773,8 @@ void plugin_init_all (void) le = le->next; } + start_write_threads ((size_t) write_threads_num); + max_read_interval = global_option_get_time ("MaxReadInterval", DEFAULT_MAX_READ_INTERVAL); @@ -2074,8 +2088,10 @@ static int plugin_dispatch_values_internal (value_list_t *vl) int free_meta_data = 0; - if ((vl == NULL) || (vl->type[0] == 0) - || (vl->values == NULL) || (vl->values_len < 1)) + assert(vl); + assert(vl->plugin); + + if (vl->type[0] == 0 || vl->values == NULL || vl->values_len < 1) { ERROR ("plugin_dispatch_values: Invalid value list " "from plugin %s.", vl->plugin); @@ -2196,7 +2212,7 @@ static int plugin_dispatch_values_internal (value_list_t *vl) * don't get confused.. */ if (saved_values != NULL) { - free (vl->values); + sfree (vl->values); vl->values = saved_values; vl->values_len = saved_values_len; } @@ -2225,7 +2241,7 @@ static int plugin_dispatch_values_internal (value_list_t *vl) * confused.. */ if (saved_values != NULL) { - free (vl->values); + sfree (vl->values); vl->values = saved_values; vl->values_len = saved_values_len; } @@ -2340,7 +2356,7 @@ int plugin_dispatch_multivalue (value_list_t const *template, /* {{{ */ assert (template->values_len == 1); - /* Calculate sum for Gauge to calculate percent if needed */ + /* Calculate sum for Gauge to calculate percent if needed */ if (DS_TYPE_GAUGE == store_type) { va_start (ap, store_type); while (42) @@ -2383,7 +2399,7 @@ int plugin_dispatch_multivalue (value_list_t const *template, /* {{{ */ case DS_TYPE_GAUGE: vl->values[0].gauge = va_arg (ap, gauge_t); if (store_percentage) - vl->values[0].gauge *= 100.0 / sum; + vl->values[0].gauge *= sum ? (100.0 / sum) : 0; break; case DS_TYPE_ABSOLUTE: vl->values[0].absolute = va_arg (ap, absolute_t); @@ -2561,13 +2577,12 @@ static int plugin_notification_meta_add (notification_t *n, return (-1); } - meta = (notification_meta_t *) malloc (sizeof (notification_meta_t)); + meta = calloc (1, sizeof (*meta)); if (meta == NULL) { - ERROR ("plugin_notification_meta_add: malloc failed."); + ERROR ("plugin_notification_meta_add: calloc failed."); return (-1); } - memset (meta, 0, sizeof (notification_meta_t)); sstrncpy (meta->name, name, sizeof (meta->name)); meta->type = type; @@ -2711,7 +2726,11 @@ int plugin_notification_meta_free (notification_meta_t *n) if (this->type == NM_TYPE_STRING) { - free ((char *)this->nm_value.nm_string); + /* Assign to a temporary variable to work around nm_string's const + * modifier. */ + void *tmp = (void *) this->nm_value.nm_string; + + sfree (tmp); this->nm_value.nm_string = NULL; } sfree (this); @@ -2818,7 +2837,7 @@ static void *plugin_thread_start (void *arg) plugin_set_ctx (plugin_thread->ctx); - free (plugin_thread); + sfree (plugin_thread); return start_routine (plugin_arg); } /* void *plugin_thread_start */