AC_HEADER_DIRENT
AC_HEADER_STDBOOL
-AC_CHECK_HEADERS(stdio.h errno.h math.h stdarg.h syslog.h fcntl.h signal.h assert.h sys/types.h sys/socket.h sys/select.h poll.h netdb.h arpa/inet.h sys/resource.h sys/param.h kstat.h regex.h sys/ioctl.h endian.h sys/isa_defs.h fnmatch.h libgen.h)
+AC_CHECK_HEADERS([ \
+ arpa/inet.h \
+ assert.h \
+ ctype.h \
+ endian.h \
+ errno.h \
+ fcntl.h \
+ fnmatch.h \
+ fs_info.h \
+ fshelp.h \
+ grp.h \
+ kstat.h \
+ kvm.h \
+ libgen.h \
+ limits.h \
+ locale.h \
+ math.h \
+ mntent.h \
+ mnttab.h \
+ netdb.h \
+ paths.h \
+ poll.h \
+ pthread_np.h \
+ pwd.h \
+ regex.h \
+ signal.h \
+ stdarg.h \
+ stdio.h \
+ sys/fs_types.h \
+ sys/fstyp.h \
+ sys/ioctl.h \
+ sys/isa_defs.h \
+ sys/mntent.h \
+ sys/mnttab.h \
+ sys/param.h \
+ sys/resource.h \
+ sys/select.h \
+ sys/socket.h \
+ sys/statfs.h \
+ sys/statvfs.h \
+ sys/types.h \
+ sys/un.h \
+ sys/vfs.h \
+ sys/vfstab.h \
+ sys/vmmeter.h \
+ syslog.h \
+ wordexp.h \
+])
# For entropy plugin on newer NetBSD
AC_CHECK_HEADERS(sys/rndio.h, [], [],
#endif
])
-AC_CHECK_HEADERS([ \
- ctype.h \
- fs_info.h \
- fshelp.h \
- grp.h \
- kvm.h \
- limits.h \
- locale.h \
- mntent.h \
- mnttab.h \
- paths.h \
- pwd.h \
- sys/fs_types.h \
- sys/fstyp.h \
- sys/mntent.h \
- sys/mnttab.h \
- sys/statfs.h \
- sys/statvfs.h \
- sys/un.h \
- sys/vfs.h \
- sys/vfstab.h \
- sys/vmmeter.h \
- wordexp.h \
-])
-
# --enable-xfs {{{
AC_ARG_ENABLE([xfs],
[AS_HELP_STRING([--enable-xfs], [xfs support in df plugin @<:@default=yes@:>@])],
#endif
])
+# check for pthread_setname_np
+SAVE_LDFLAGS="$LDFLAGS"
+LDFLAGS="$LDFLAGS -lpthread"
+
+AC_MSG_CHECKING([for pthread_setname_np])
+ have_pthread_setname_np="no"
+ AC_LINK_IFELSE([AC_LANG_PROGRAM(
+[[
+#define _GNU_SOURCE
+#include <pthread.h>
+]],
+[[
+ pthread_setname_np((pthread_t) {0}, "conftest");
+]]
+ )], [
+ have_pthread_setname_np="yes"
+ AC_DEFINE(HAVE_PTHREAD_SETNAME_NP, 1, [pthread_setname_np() is available.])
+ ])
+
+AC_MSG_RESULT([$have_pthread_setname_np])
+
+# check for pthread_set_name_np(3) (FreeBSD)
+AC_MSG_CHECKING([for pthread_set_name_np])
+ have_pthread_set_name_np="no"
+ AC_LINK_IFELSE([AC_LANG_PROGRAM(
+[[
+#include <pthread_np.h>
+]],
+[[
+ pthread_set_name_np((pthread_t) {0}, "conftest");
+]]
+ )], [
+ have_pthread_set_name_np="yes"
+ AC_DEFINE(HAVE_PTHREAD_SET_NAME_NP, 1, [pthread_set_name_np() is available.])
+ ])
+AC_MSG_RESULT([$have_pthread_set_name_np])
+
+LDFLAGS="$SAVE_LDFLAGS"
+
#
# Checks for libraries begin here
#
memset (tmp, 0, sizeof (*tmp));
status = plugin_thread_create (tmp, /* attr = */ NULL,
- camqp_subscribe_thread, conf);
+ camqp_subscribe_thread, conf, "amqp subscribe");
if (status != 0)
{
char errbuf[1024];
* 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"
#include "utils_time.h"
#include "utils_random.h"
+#if HAVE_PTHREAD_NP_H
+# include <pthread_np.h> /* for pthread_set_name_np(3) */
+#endif
+
#include <ltdl.h>
/*
static pthread_mutex_t read_lock = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t read_cond = PTHREAD_COND_INITIALIZER;
static pthread_t *read_threads = NULL;
-static int read_threads_num = 0;
+static size_t read_threads_num = 0;
static cdtime_t max_read_interval = DEFAULT_MAX_READ_INTERVAL;
static write_queue_t *write_queue_head;
return ((void *) 0);
} /* void *plugin_read_thread */
-static void start_read_threads (int num)
+#ifdef PTHREAD_MAX_NAMELEN_NP
+# define THREAD_NAME_MAX PTHREAD_MAX_NAMELEN_NP
+#else
+# define THREAD_NAME_MAX 16
+#endif
+
+static void set_thread_name(pthread_t tid, char const *name) {
+#if defined(HAVE_PTHREAD_SETNAME_NP) || defined(HAVE_PTHREAD_SET_NAME_NP)
+
+ /* glibc limits the length of the name and fails if the passed string
+ * is too long, so we truncate it here. */
+ char n[THREAD_NAME_MAX];
+ if (strlen (name) >= THREAD_NAME_MAX)
+ WARNING("set_thread_name(\"%s\"): name too long", name);
+ sstrncpy (n, name, sizeof(n));
+
+#if defined(HAVE_PTHREAD_SETNAME_NP)
+ int status = pthread_setname_np (tid, n);
+ if (status != 0)
+ {
+ char errbuf[1024];
+ ERROR ("set_thread_name(\"%s\"): %s", n,
+ sstrerror (status, errbuf, sizeof(errbuf)));
+ }
+#else /* if defined(HAVE_PTHREAD_SET_NAME_NP) */
+ pthread_set_name_np (tid, n);
+#endif
+
+#endif
+}
+
+static void start_read_threads (size_t num) /* {{{ */
{
if (read_threads != NULL)
return;
}
read_threads_num = 0;
- for (int i = 0; i < num; i++)
+ for (size_t i = 0; i < num; i++)
{
- if (pthread_create (read_threads + read_threads_num, NULL,
- plugin_read_thread, NULL) == 0)
- {
- read_threads_num++;
- }
- else
+ int status = pthread_create (read_threads + read_threads_num,
+ /* attr = */ NULL,
+ plugin_read_thread,
+ /* arg = */ NULL);
+ if (status != 0)
{
- ERROR ("plugin: start_read_threads: pthread_create failed.");
+ char errbuf[1024];
+ ERROR ("plugin: start_read_threads: pthread_create failed "
+ "with status %i (%s).", status,
+ sstrerror (status, errbuf, sizeof (errbuf)));
return;
}
+
+ char name[THREAD_NAME_MAX];
+ ssnprintf (name, sizeof (name), "reader#%zu", read_threads_num);
+ set_thread_name (read_threads[read_threads_num], name);
+
+ read_threads_num++;
} /* for (i) */
-} /* void start_read_threads */
+} /* }}} void start_read_threads */
static void stop_read_threads (void)
{
if (read_threads == NULL)
return;
- INFO ("collectd: Stopping %i read threads.", read_threads_num);
+ INFO ("collectd: Stopping %zu read threads.", read_threads_num);
pthread_mutex_lock (&read_lock);
read_loop = 0;
pthread_cond_broadcast (&read_cond);
pthread_mutex_unlock (&read_lock);
- for (int i = 0; i < read_threads_num; i++)
+ for (size_t i = 0; i < read_threads_num; i++)
{
if (pthread_join (read_threads[i], NULL) != 0)
{
write_threads_num = 0;
for (size_t i = 0; i < num; i++)
{
- int status;
-
- status = pthread_create (write_threads + write_threads_num,
+ int status = pthread_create (write_threads + write_threads_num,
/* attr = */ NULL,
plugin_write_thread,
/* arg = */ NULL);
return;
}
+ char name[THREAD_NAME_MAX];
+ ssnprintf (name, sizeof (name), "writer#%zu", write_threads_num);
+ set_thread_name (write_threads[write_threads_num], name);
+
write_threads_num++;
} /* for (i) */
} /* }}} void start_write_threads */
rt = global_option_get ("ReadThreads");
num = atoi (rt);
if (num != -1)
- start_read_threads ((num > 0) ? num : 5);
+ start_read_threads ((num > 0) ? ((size_t) num) : 5);
}
return ret;
} /* void plugin_init_all */
} /* 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 const *name)
{
plugin_thread_t *plugin_thread;
plugin_thread = malloc (sizeof (*plugin_thread));
if (plugin_thread == NULL)
- return -1;
+ return ENOMEM;
plugin_thread->ctx = plugin_get_ctx ();
plugin_thread->start_routine = start_routine;
plugin_thread->arg = arg;
- return pthread_create (thread, attr,
+ int ret = pthread_create (thread, attr,
plugin_thread_start, plugin_thread);
+ if (ret != 0)
+ {
+ sfree (plugin_thread);
+ return ret;
+ }
+
+ if (name != NULL)
+ set_thread_name (*thread, name);
+
+ return 0;
} /* int plugin_thread_create */
/* vim: set sw=8 ts=8 noet fdm=marker : */
*/
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 const *name);
/*
* Plugins need to implement this
return (-1);
status = plugin_thread_create (&listen_thread, NULL, dns_child_loop,
- (void *) 0);
+ (void *) 0, "dns listen");
if (status != 0)
{
char errbuf[1024];
collectors[i]->socket = NULL;
if (plugin_thread_create (&collectors[i]->thread,
- &ptattr, collect, collectors[i]) != 0) {
+ &ptattr, collect, collectors[i],
+ "email collector") != 0) {
char errbuf[1024];
log_err ("plugin_thread_create() failed: %s",
sstrerror (errno, errbuf, sizeof (errbuf)));
static int email_init (void)
{
if (plugin_thread_create (&connector, NULL,
- open_connection, NULL) != 0) {
+ open_connection, NULL, "email listener") != 0) {
char errbuf[1024];
disabled = 1;
log_err ("plugin_thread_create() failed: %s",
pthread_attr_init (&attr);
pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
- plugin_thread_create (&t, &attr, exec_read_one, (void *) pl);
+ plugin_thread_create (&t, &attr, exec_read_one, (void *) pl, "exec read");
pthread_attr_destroy (&attr);
} /* for (pl) */
pthread_attr_init (&attr);
pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
- plugin_thread_create (&t, &attr, exec_notification_one, (void *) pln);
+ plugin_thread_create (&t, &attr, exec_notification_one, (void *) pln,
+ "exec notify");
pthread_attr_destroy (&attr);
} /* for (pl) */
mc_receive_thread_loop = 1;
status = plugin_thread_create (&mc_receive_thread_id, /* attr = */ NULL,
- mc_receive_thread, /* args = */ NULL);
+ mc_receive_thread, /* args = */ NULL, "gmond recv");
if (status != 0)
{
ERROR ("gmond plugin: Starting receive thread failed.");
CDTIME_T_TO_DOUBLE (cgps_config_data.timeout),
CDTIME_T_TO_DOUBLE (cgps_config_data.pause_connect));
- status = plugin_thread_create (&cgps_thread_id, NULL, cgps_thread, NULL);
+ status = plugin_thread_create (&cgps_thread_id, NULL, cgps_thread, NULL, "gps");
if (status != 0)
{
ERROR ("gps plugin: pthread_create() failed.");
c_ipmi_active = 1;
status = plugin_thread_create (&thread_id, /* attr = */ NULL, thread_main,
- /* user data = */ NULL);
+ /* user data = */ NULL, "ipmi");
if (status != 0)
{
c_ipmi_active = 0;
status = plugin_thread_create (&subscribers[i]->thread,
/* attrs = */ NULL,
/* func = */ subscribers_thread,
- /* args = */ subscribers[i]);
+ /* args = */ subscribers[i],
+ /* name = */ "mqtt");
if (status != 0)
{
char errbuf[1024];
status = plugin_thread_create (&dispatch_thread_id,
NULL /* no attributes */,
dispatch_thread,
- NULL /* no argument */);
+ NULL /* no argument */, "network disp");
if (status != 0)
{
char errbuf[1024];
status = plugin_thread_create (&receive_thread_id,
NULL /* no attributes */,
receive_thread,
- NULL /* no argument */);
+ NULL /* no argument */, "network recv");
if (status != 0)
{
char errbuf[1024];
status = plugin_thread_create (&collector_thread_id,
/* attrs = */ NULL,
collector_thread,
- /* args = */ NULL);
+ /* args = */ NULL, "pinba collector");
if (status != 0)
{
char errbuf[1024];
ping_thread_loop = 1;
ping_thread_error = 0;
status = plugin_thread_create (&ping_thread_id, /* attr = */ NULL,
- ping_thread, /* arg = */ (void *) 0);
+ ping_thread, /* arg = */ (void *) 0, "ping");
if (status != 0)
{
ping_thread_loop = 0;
ERROR("python: Unable to create pipe.");
return 1;
}
- if (plugin_thread_create(&thread, NULL, cpy_interactive, pipefd + 1)) {
+ if (plugin_thread_create(&thread, NULL, cpy_interactive, pipefd + 1,
+ "python interpreter")) {
ERROR("python: Error creating thread for interactive interpreter.");
}
if(read(pipefd[0], &buf, 1))
pthread_mutex_unlock (&cache_lock);
status = plugin_thread_create (&queue_thread, /* attr = */ NULL,
- rrd_queue_thread, /* args = */ NULL);
+ rrd_queue_thread, /* args = */ NULL, "rrdtool queue");
if (status != 0)
{
ERROR ("rrdtool plugin: Cannot create queue-thread.");
}
status = plugin_thread_create(&sr_thread, NULL, sigrok_read_thread,
- NULL);
+ NULL, "sigrok read");
if (status != 0)
{
char errbuf[1024];
DEBUG ("Spawning child to handle connection on fd #%i", *remote_fd);
status = plugin_thread_create (&th, &th_attr,
- us_handle_client, (void *) remote_fd);
+ us_handle_client, (void *) remote_fd, "unixsock conn");
if (status != 0)
{
char errbuf[1024];
loop = 1;
status = plugin_thread_create (&listen_thread, NULL,
- us_server_thread, NULL);
+ us_server_thread, NULL, "unixsock listen");
if (status != 0)
{
char errbuf[1024];