projects
/
collectd.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge pull request #1876 from octo/issue/1819
[collectd.git]
/
src
/
daemon
/
plugin.c
diff --git
a/src/daemon/plugin.c
b/src/daemon/plugin.c
index
206c6e2
..
1bee8cd
100644
(file)
--- a/
src/daemon/plugin.c
+++ b/
src/daemon/plugin.c
@@
-26,6
+26,7
@@
**/
#include "collectd.h"
**/
#include "collectd.h"
+
#include "common.h"
#include "plugin.h"
#include "configfile.h"
#include "common.h"
#include "plugin.h"
#include "configfile.h"
@@
-288,7
+289,7
@@
static int register_callback (llist_t **list, /* {{{ */
{
ERROR ("plugin: register_callback: "
"llentry_create failed.");
{
ERROR ("plugin: register_callback: "
"llentry_create failed.");
- free (key);
+
s
free (key);
destroy_callback (cf);
return (-1);
}
destroy_callback (cf);
return (-1);
}
@@
-318,8
+319,8
@@
static void log_list_callbacks (llist_t **list, /* {{{ */
{
char *str;
int len;
{
char *str;
int len;
- llentry_t *le;
int i;
int i;
+ llentry_t *le;
int n;
char **keys;
int n;
char **keys;
@@
-358,9
+359,9
@@
static void log_list_callbacks (llist_t **list, /* {{{ */
*str = '\0';
strjoin(str, len, keys, n, "', '");
INFO("%s ['%s']", comment, str);
*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, /* {{{ */
} /* }}} void log_list_callbacks */
static int create_register_callback (llist_t **list, /* {{{ */
@@
-368,13
+369,12
@@
static int create_register_callback (llist_t **list, /* {{{ */
{
callback_func_t *cf;
{
callback_func_t *cf;
- cf =
(callback_func_t *) malloc (
sizeof (*cf));
+ cf =
calloc (1,
sizeof (*cf));
if (cf == NULL)
{
if (cf == NULL)
{
- ERROR ("plugin: create_register_callback:
m
alloc failed.");
+ ERROR ("plugin: create_register_callback:
c
alloc failed.");
return (-1);
}
return (-1);
}
- memset (cf, 0, sizeof (*cf));
cf->cf_callback = callback;
if (ud == NULL)
cf->cf_callback = callback;
if (ud == NULL)
@@
-655,8
+655,6
@@
static void *plugin_read_thread (void __attribute__((unused)) *args)
static void start_read_threads (int num)
{
static void start_read_threads (int num)
{
- int i;
-
if (read_threads != NULL)
return;
if (read_threads != NULL)
return;
@@
-668,7
+666,7
@@
static void start_read_threads (int num)
}
read_threads_num = 0;
}
read_threads_num = 0;
- for (i = 0; i < num; i++)
+ for (i
nt i
= 0; i < num; i++)
{
if (pthread_create (read_threads + read_threads_num, NULL,
plugin_read_thread, NULL) == 0)
{
if (pthread_create (read_threads + read_threads_num, NULL,
plugin_read_thread, NULL) == 0)
@@
-685,8
+683,6
@@
static void start_read_threads (int num)
static void stop_read_threads (void)
{
static void stop_read_threads (void)
{
- int i;
-
if (read_threads == NULL)
return;
if (read_threads == NULL)
return;
@@
-698,7
+694,7
@@
static void stop_read_threads (void)
pthread_cond_broadcast (&read_cond);
pthread_mutex_unlock (&read_lock);
pthread_cond_broadcast (&read_cond);
pthread_mutex_unlock (&read_lock);
- for (i = 0; i < read_threads_num; i++)
+ for (i
nt i
= 0; i < read_threads_num; i++)
{
if (pthread_join (read_threads[i], NULL) != 0)
{
{
if (pthread_join (read_threads[i], NULL) != 0)
{
@@
-870,8
+866,6
@@
static void *plugin_write_thread (void __attribute__((unused)) *args) /* {{{ */
static void start_write_threads (size_t num) /* {{{ */
{
static void start_write_threads (size_t num) /* {{{ */
{
- size_t i;
-
if (write_threads != NULL)
return;
if (write_threads != NULL)
return;
@@
-883,7
+877,7
@@
static void start_write_threads (size_t num) /* {{{ */
}
write_threads_num = 0;
}
write_threads_num = 0;
- for (i = 0; i < num; i++)
+ for (
size_t
i = 0; i < num; i++)
{
int status;
{
int status;
@@
-959,17
+953,17
@@
static void stop_write_threads (void) /* {{{ */
*/
void plugin_set_dir (const char *dir)
{
*/
void plugin_set_dir (const char *dir)
{
- if (plugindir != NULL)
- free (plugindir);
+ sfree (plugindir);
if (dir == NULL)
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)
}
static _Bool plugin_is_loaded (char const *name)
@@
-977,7
+971,7
@@
static _Bool plugin_is_loaded (char const *name)
int status;
if (plugins_loaded == NULL)
int status;
if (plugins_loaded == NULL)
- plugins_loaded = c_avl_create ((
void *
) strcasecmp);
+ plugins_loaded = c_avl_create ((
int (*) (const void *, const void *)
) strcasecmp);
assert (plugins_loaded != NULL);
status = c_avl_get (plugins_loaded, name, /* ret_value = */ NULL);
assert (plugins_loaded != NULL);
status = c_avl_get (plugins_loaded, name, /* ret_value = */ NULL);
@@
-998,7
+992,7
@@
static int plugin_mark_loaded (char const *name)
return (status);
}
return (status);
}
-static void plugin_free_loaded ()
+static void plugin_free_loaded (
void
)
{
void *key;
void *value;
{
void *key;
void *value;
@@
-1244,14
+1238,13
@@
int plugin_register_read (const char *name,
read_func_t *rf;
int status;
read_func_t *rf;
int status;
- rf =
malloc (
sizeof (*rf));
+ rf =
calloc (1,
sizeof (*rf));
if (rf == NULL)
{
if (rf == NULL)
{
- ERROR ("plugin_register_read:
m
alloc failed.");
+ ERROR ("plugin_register_read:
c
alloc failed.");
return (ENOMEM);
}
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;
rf->rf_callback = (void *) callback;
rf->rf_udata.data = NULL;
rf->rf_udata.free_func = NULL;
@@
-1278,14
+1271,13
@@
int plugin_register_complex_read (const char *group, const char *name,
read_func_t *rf;
int status;
read_func_t *rf;
int status;
- rf =
malloc (
sizeof (*rf));
+ rf =
calloc (1,
sizeof (*rf));
if (rf == NULL)
{
if (rf == NULL)
{
- ERROR ("plugin_register_complex_read:
m
alloc failed.");
+ ERROR ("plugin_register_complex_read:
c
alloc failed.");
return (ENOMEM);
}
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));
rf->rf_callback = (void *) callback;
if (group != NULL)
sstrncpy (rf->rf_group, group, sizeof (rf->rf_group));
@@
-1337,13
+1329,13
@@
static void plugin_flush_timeout_callback_free (void *data)
if (cb == NULL) return;
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)
{
} /* static void plugin_flush_callback_free */
static char *plugin_flush_callback_name (const char *name)
{
- char *flush_prefix = "flush/";
+ c
onst c
har *flush_prefix = "flush/";
size_t prefix_size;
char *flush_name;
size_t name_size;
size_t prefix_size;
char *flush_name;
size_t name_size;
@@
-1351,7
+1343,7
@@
static char *plugin_flush_callback_name (const char *name)
prefix_size = strlen(flush_prefix);
name_size = strlen(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.");
if (flush_name == NULL)
{
ERROR ("plugin_flush_callback_name: malloc failed.");
@@
-1378,18
+1370,17
@@
int plugin_register_flush (const char *name,
if (ctx.flush_interval != 0)
{
char *flush_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);
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.");
if (cb == NULL)
{
ERROR ("plugin_register_flush: malloc failed.");
- sfree(flush_name);
+ sfree
(flush_name);
return (-1);
}
return (-1);
}
@@
-1397,27
+1388,27
@@
int plugin_register_flush (const char *name,
if (cb->name == NULL)
{
ERROR ("plugin_register_flush: strdup failed.");
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;
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,
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)
{
if (status != 0)
{
- sfree(cb->name);
- sfree(cb);
+ sfree
(cb->name);
+ sfree
(cb);
return status;
}
}
return status;
}
}
@@
-1463,7
+1454,6
@@
static void plugin_free_data_sets (void)
int plugin_register_data_set (const data_set_t *ds)
{
data_set_t *ds_copy;
int plugin_register_data_set (const data_set_t *ds)
{
data_set_t *ds_copy;
- size_t i;
if ((data_sets != NULL)
&& (c_avl_get (data_sets, ds->type, NULL) == 0))
if ((data_sets != NULL)
&& (c_avl_get (data_sets, ds->type, NULL) == 0))
@@
-1478,20
+1468,20
@@
int plugin_register_data_set (const data_set_t *ds)
return (-1);
}
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));
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)
{
* ds->ds_num);
if (ds_copy->ds == NULL)
{
- free (ds_copy);
+
s
free (ds_copy);
return (-1);
}
return (-1);
}
- for (i = 0; i < ds->ds_num; i++)
+ for (
size_t
i = 0; i < ds->ds_num; i++)
memcpy (ds_copy->ds + i, ds->ds + i, sizeof (data_source_t));
return (c_avl_insert (data_sets, (void *) ds_copy->type, (void *) ds_copy));
memcpy (ds_copy->ds + i, ds->ds + i, sizeof (data_source_t));
return (c_avl_insert (data_sets, (void *) ds_copy->type, (void *) ds_copy));
@@
-1651,7
+1641,7
@@
int plugin_unregister_flush (const char *name)
if (flush_name != NULL)
{
plugin_unregister_read(flush_name);
if (flush_name != NULL)
{
plugin_unregister_read(flush_name);
- sfree(flush_name);
+ sfree
(flush_name);
}
}
}
}
@@
-1694,12
+1684,12
@@
int plugin_unregister_notification (const char *name)
return (plugin_unregister (list_notification, name));
}
return (plugin_unregister (list_notification, name));
}
-
void
plugin_init_all (void)
+
int
plugin_init_all (void)
{
char const *chain_name;
{
char const *chain_name;
- long write_threads_num;
llentry_t *le;
int status;
llentry_t *le;
int status;
+ int ret = 0;
/* Init the value cache */
uc_init ();
/* Init the value cache */
uc_init ();
@@
-1743,10
+1733,8
@@
void plugin_init_all (void)
write_threads_num = 5;
}
write_threads_num = 5;
}
- start_write_threads ((size_t) write_threads_num);
-
if ((list_init == NULL) && (read_heap == NULL))
if ((list_init == NULL) && (read_heap == NULL))
- return;
+ return
ret
;
/* Calling all init callbacks before checking if read callbacks
* are available allows the init callbacks to register the read
/* Calling all init callbacks before checking if read callbacks
* are available allows the init callbacks to register the read
@@
-1775,11
+1763,14
@@
void plugin_init_all (void)
* handling themselves. */
/* FIXME: Unload _all_ functions */
plugin_unregister_read (le->key);
* handling themselves. */
/* FIXME: Unload _all_ functions */
plugin_unregister_read (le->key);
+ ret = -1;
}
le = le->next;
}
}
le = le->next;
}
+ start_write_threads ((size_t) write_threads_num);
+
max_read_interval = global_option_get_time ("MaxReadInterval",
DEFAULT_MAX_READ_INTERVAL);
max_read_interval = global_option_get_time ("MaxReadInterval",
DEFAULT_MAX_READ_INTERVAL);
@@
-1794,6
+1785,7
@@
void plugin_init_all (void)
if (num != -1)
start_read_threads ((num > 0) ? num : 5);
}
if (num != -1)
start_read_threads ((num > 0) ? num : 5);
}
+ return ret;
} /* void plugin_init_all */
/* TODO: Rename this function. */
} /* void plugin_init_all */
/* TODO: Rename this function. */
@@
-1977,14
+1969,15
@@
int plugin_flush (const char *plugin, cdtime_t timeout, const char *identifier)
return (0);
} /* int plugin_flush */
return (0);
} /* int plugin_flush */
-
void
plugin_shutdown_all (void)
+
int
plugin_shutdown_all (void)
{
llentry_t *le;
{
llentry_t *le;
-
- stop_read_threads ();
+ int ret = 0; // Assume success.
destroy_all_callbacks (&list_init);
destroy_all_callbacks (&list_init);
+ stop_read_threads ();
+
pthread_mutex_lock (&read_lock);
llist_destroy (read_list);
read_list = NULL;
pthread_mutex_lock (&read_lock);
llist_destroy (read_list);
read_list = NULL;
@@
-1992,6
+1985,10
@@
void plugin_shutdown_all (void)
destroy_read_heap ();
destroy_read_heap ();
+ /* blocks until all write threads have shut down. */
+ stop_write_threads ();
+
+ /* ask all plugins to write out the state they kept. */
plugin_flush (/* plugin = */ NULL,
/* timeout = */ 0,
/* identifier = */ NULL);
plugin_flush (/* plugin = */ NULL,
/* timeout = */ 0,
/* identifier = */ NULL);
@@
-2016,13
+2013,12
@@
void plugin_shutdown_all (void)
* after callback returns. */
le = le->next;
* after callback returns. */
le = le->next;
- (*callback) ();
+ if ((*callback) () != 0)
+ ret = -1;
plugin_set_ctx (old_ctx);
}
plugin_set_ctx (old_ctx);
}
- stop_write_threads ();
-
/* Write plugins which use the `user_data' pointer usually need the
* same data available to the flush callback. If this is the case, set
* the free_function to NULL when registering the flush callback and to
/* Write plugins which use the `user_data' pointer usually need the
* same data available to the flush callback. If this is the case, set
* the free_function to NULL when registering the flush callback and to
@@
-2038,6
+2034,7
@@
void plugin_shutdown_all (void)
plugin_free_loaded ();
plugin_free_data_sets ();
plugin_free_loaded ();
plugin_free_data_sets ();
+ return (ret);
} /* void plugin_shutdown_all */
int plugin_dispatch_missing (const value_list_t *vl) /* {{{ */
} /* void plugin_shutdown_all */
int plugin_dispatch_missing (const value_list_t *vl) /* {{{ */
@@
-2093,8
+2090,10
@@
static int plugin_dispatch_values_internal (value_list_t *vl)
int free_meta_data = 0;
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);
{
ERROR ("plugin_dispatch_values: Invalid value list "
"from plugin %s.", vl->plugin);
@@
-2215,7
+2214,7
@@
static int plugin_dispatch_values_internal (value_list_t *vl)
* don't get confused.. */
if (saved_values != NULL)
{
* don't get confused.. */
if (saved_values != NULL)
{
- free (vl->values);
+
s
free (vl->values);
vl->values = saved_values;
vl->values_len = saved_values_len;
}
vl->values = saved_values;
vl->values_len = saved_values_len;
}
@@
-2244,7
+2243,7
@@
static int plugin_dispatch_values_internal (value_list_t *vl)
* confused.. */
if (saved_values != NULL)
{
* confused.. */
if (saved_values != NULL)
{
- free (vl->values);
+
s
free (vl->values);
vl->values = saved_values;
vl->values_len = saved_values_len;
}
vl->values = saved_values;
vl->values_len = saved_values_len;
}
@@
-2359,7
+2358,7
@@
int plugin_dispatch_multivalue (value_list_t const *template, /* {{{ */
assert (template->values_len == 1);
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)
if (DS_TYPE_GAUGE == store_type) {
va_start (ap, store_type);
while (42)
@@
-2402,7
+2401,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)
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);
break;
case DS_TYPE_ABSOLUTE:
vl->values[0].absolute = va_arg (ap, absolute_t);
@@
-2580,13
+2579,12
@@
static int plugin_notification_meta_add (notification_t *n,
return (-1);
}
return (-1);
}
- meta =
(notification_meta_t *) malloc (sizeof (notification_meta_t
));
+ meta =
calloc (1, sizeof (*meta
));
if (meta == NULL)
{
if (meta == NULL)
{
- ERROR ("plugin_notification_meta_add:
m
alloc failed.");
+ ERROR ("plugin_notification_meta_add:
c
alloc failed.");
return (-1);
}
return (-1);
}
- memset (meta, 0, sizeof (notification_meta_t));
sstrncpy (meta->name, name, sizeof (meta->name));
meta->type = type;
sstrncpy (meta->name, name, sizeof (meta->name));
meta->type = type;
@@
-2683,14
+2681,12
@@
int plugin_notification_meta_add_boolean (notification_t *n,
int plugin_notification_meta_copy (notification_t *dst,
const notification_t *src)
{
int plugin_notification_meta_copy (notification_t *dst,
const notification_t *src)
{
- notification_meta_t *meta;
-
assert (dst != NULL);
assert (src != NULL);
assert (dst != src);
assert ((src->meta == NULL) || (src->meta != dst->meta));
assert (dst != NULL);
assert (src != NULL);
assert (dst != src);
assert ((src->meta == NULL) || (src->meta != dst->meta));
- for (meta = src->meta; meta != NULL; meta = meta->next)
+ for (
notification_meta_t *
meta = src->meta; meta != NULL; meta = meta->next)
{
if (meta->type == NM_TYPE_STRING)
plugin_notification_meta_add_string (dst, meta->name,
{
if (meta->type == NM_TYPE_STRING)
plugin_notification_meta_add_string (dst, meta->name,
@@
-2730,7
+2726,11
@@
int plugin_notification_meta_free (notification_meta_t *n)
if (this->type == NM_TYPE_STRING)
{
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);
this->nm_value.nm_string = NULL;
}
sfree (this);
@@
-2837,7
+2837,7
@@
static void *plugin_thread_start (void *arg)
plugin_set_ctx (plugin_thread->ctx);
plugin_set_ctx (plugin_thread->ctx);
- free (plugin_thread);
+
s
free (plugin_thread);
return start_routine (plugin_arg);
} /* void *plugin_thread_start */
return start_routine (plugin_arg);
} /* void *plugin_thread_start */