* Sebastian Harl <sh at tokkee.org>
**/
+/* _GNU_SOURCE is needed in Linux to use pthread_setname_np */
+#define _GNU_SOURCE
+
#include "collectd.h"
#include "common.h"
static char *plugindir = NULL;
#ifndef DEFAULT_MAX_READ_INTERVAL
-# define DEFAULT_MAX_READ_INTERVAL TIME_T_TO_CDTIME_T (86400)
+# define DEFAULT_MAX_READ_INTERVAL TIME_T_TO_CDTIME_T_STATIC (86400)
#endif
static c_heap_t *read_heap = NULL;
static llist_t *read_list;
} /* }}} void log_list_callbacks */
static int create_register_callback (llist_t **list, /* {{{ */
- const char *name, void *callback, user_data_t *ud)
+ const char *name, void *callback, user_data_t const *ud)
{
callback_func_t *cf;
&& (cdtime () < rf->rf_next_read)
&& rc == 0)
{
- struct timespec ts = { 0 };
-
- CDTIME_T_TO_TIMESPEC (rf->rf_next_read, &ts);
-
rc = pthread_cond_timedwait (&read_cond, &read_lock,
- &ts);
+ &CDTIME_T_TO_TIMESPEC (rf->rf_next_read));
}
/* Must hold `read_lock' when accessing `rf->rf_type'. */
if (pthread_create (read_threads + read_threads_num, NULL,
plugin_read_thread, NULL) == 0)
{
+#if defined(HAVE_PTHREAD_SETNAME_NP) || defined(HAVE_PTHREAD_SET_NAME_NP)
+ char thread_name[16];
+ sstrncpy (thread_name, "plugin reader", sizeof(thread_name));
+# if defined(HAVE_PTHREAD_SETNAME_NP)
+ pthread_setname_np (*(read_threads + read_threads_num),
+ thread_name);
+# elif defined(HAVE_PTHREAD_SET_NAME_NP)
+ pthread_set_name_np (*(read_threads + read_threads_num),
+ thread_name);
+# endif
+#endif
read_threads_num++;
}
else
"with status %i (%s).", status,
sstrerror (status, errbuf, sizeof (errbuf)));
return;
+ } else {
+#if defined(HAVE_PTHREAD_SETNAME_NP) || defined(HAVE_PTHREAD_SET_NAME_NP)
+ char thread_name[16];
+ sstrncpy (thread_name, "plugin writer", sizeof(thread_name));
+# if defined(HAVE_PTHREAD_SETNAME_NP)
+ pthread_setname_np (*(write_threads + write_threads_num),
+ thread_name);
+# elif defined(HAVE_PTHREAD_SET_NAME_NP)
+ pthread_set_name_np (*(write_threads + write_threads_num),
+ thread_name);
+# endif
+#endif
+ write_threads_num++;
}
-
- write_threads_num++;
} /* for (i) */
} /* }}} void start_write_threads */
int plugin_register_complex_read (const char *group, const char *name,
plugin_read_cb callback,
cdtime_t interval,
- user_data_t *user_data)
+ user_data_t const *user_data)
{
read_func_t *rf;
int status;
} /* int plugin_register_complex_read */
int plugin_register_write (const char *name,
- plugin_write_cb callback, user_data_t *ud)
+ plugin_write_cb callback, user_data_t const *ud)
{
return (create_register_callback (&list_write, name,
(void *) callback, ud));
} /* static char *plugin_flush_callback_name */
int plugin_register_flush (const char *name,
- plugin_flush_cb callback, user_data_t *ud)
+ plugin_flush_cb callback, user_data_t const *ud)
{
int status;
plugin_ctx_t ctx = plugin_get_ctx ();
}
cb->timeout = ctx.flush_timeout;
- 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 = */ &(user_data_t) {
+ .data = cb,
+ .free_func = plugin_flush_timeout_callback_free,
+ });
sfree (flush_name);
if (status != 0)
} /* int plugin_register_flush */
int plugin_register_missing (const char *name,
- plugin_missing_cb callback, user_data_t *ud)
+ plugin_missing_cb callback, user_data_t const *ud)
{
return (create_register_callback (&list_missing, name,
(void *) callback, ud));
} /* int plugin_register_data_set */
int plugin_register_log (const char *name,
- plugin_log_cb callback, user_data_t *ud)
+ plugin_log_cb callback, user_data_t const *ud)
{
return (create_register_callback (&list_log, name,
(void *) callback, ud));
} /* int plugin_register_log */
int plugin_register_notification (const char *name,
- plugin_notification_cb callback, user_data_t *ud)
+ plugin_notification_cb callback, user_data_t const *ud)
{
return (create_register_callback (&list_notification, name,
(void *) callback, ud));
} /* void *plugin_thread_start */
int plugin_thread_create (pthread_t *thread, const pthread_attr_t *attr,
- void *(*start_routine) (void *), void *arg)
+ void *(*start_routine) (void *), void *arg, char *name)
{
plugin_thread_t *plugin_thread;
+ int ret;
plugin_thread = malloc (sizeof (*plugin_thread));
if (plugin_thread == NULL)
plugin_thread->start_routine = start_routine;
plugin_thread->arg = arg;
- return pthread_create (thread, attr,
+ ret = pthread_create (thread, attr,
plugin_thread_start, plugin_thread);
+
+ if (ret == 0 && name != NULL) {
+#if defined(HAVE_PTHREAD_SETNAME_NP) || defined(HAVE_PTHREAD_SET_NAME_NP)
+ char thread_name[16];
+ sstrncpy (thread_name, name, sizeof(thread_name));
+# if defined(HAVE_PTHREAD_SETNAME_NP)
+ pthread_setname_np (*thread, thread_name);
+# elif defined(HAVE_PTHREAD_SET_NAME_NP)
+ pthread_set_name_np (*thread, thread_name);
+# endif
+#endif
+ }
+
+ return ret;
} /* int plugin_thread_create */
/* vim: set sw=8 ts=8 noet fdm=marker : */