From: Manuel Luis SanmartĂ­n Rozada Date: Sat, 8 Feb 2014 22:13:01 +0000 (+0100) Subject: Add support to set the thread name. X-Git-Tag: collectd-5.7.0~32^2~4 X-Git-Url: https://git.octo.it/?a=commitdiff_plain;h=9d9678b9e753ea0936612021f4f87f8092ab4e31;p=collectd.git Add support to set the thread name. --- diff --git a/configure.ac b/configure.ac index ac738f80..db175434 100644 --- a/configure.ac +++ b/configure.ac @@ -1662,6 +1662,48 @@ AC_CHECK_MEMBERS([kstat_io_t.nwritten, kstat_io_t.writes, kstat_io_t.nwrites, ks #endif ]) +# check for pthread_setname_np +SAVE_LDFLAGS=$LDFLAGS +LDFLAGS="$LDFLAGS -lpthread" + +AC_MSG_CHECKING([if have pthread_setname_np]) + have_pthread_setname_np="no" + AC_LINK_IFELSE([AC_LANG_PROGRAM( +[[ +#if HAVE_PTHREAD_H +#include +#endif +]], +[[ + pthread_setname_np(pthread_self(), "conftest"); +]] + )], [ + have_pthread_setname_np="yes" + AC_DEFINE(HAVE_PTHREAD_SETNAME_NP, 1, [ pthread_setname_np() is available.]) + ]) + +AC_MSG_RESULT([$have_pthread_set_name_np]) + +# check for pthread_set_name_np +AC_MSG_CHECKING([if have pthread_set_name_np]) + have_pthread_set_name_np="no" + AC_LINK_IFELSE([AC_LANG_PROGRAM( +[[ +#if HAVE_PTHREAD_H +#include +#endif +]], +[[ + pthread_set_name_np(pthread_self(), "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 # diff --git a/src/amqp.c b/src/amqp.c index 882df7c5..4089fc32 100644 --- a/src/amqp.c +++ b/src/amqp.c @@ -737,7 +737,7 @@ static int camqp_subscribe_init (camqp_config_t *conf) /* {{{ */ 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]; diff --git a/src/daemon/plugin.c b/src/daemon/plugin.c index 8b84e6a7..987f40aa 100644 --- a/src/daemon/plugin.c +++ b/src/daemon/plugin.c @@ -25,6 +25,7 @@ * Sebastian Harl **/ +#define _GNU_SOURCE #include "collectd.h" #include "common.h" @@ -662,6 +663,17 @@ static void start_read_threads (int num) 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 @@ -886,9 +898,20 @@ static void start_write_threads (size_t num) /* {{{ */ "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 */ @@ -2789,9 +2812,10 @@ static void *plugin_thread_start (void *arg) } /* 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) @@ -2801,8 +2825,22 @@ int plugin_thread_create (pthread_t *thread, const pthread_attr_t *attr, 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 : */ diff --git a/src/daemon/plugin.h b/src/daemon/plugin.h index 5a4e4c75..0f4d267c 100644 --- a/src/daemon/plugin.h +++ b/src/daemon/plugin.h @@ -465,7 +465,7 @@ cdtime_t plugin_get_interval (void); */ 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); /* * Plugins need to implement this diff --git a/src/dns.c b/src/dns.c index c8e794eb..4a5c0fa3 100644 --- a/src/dns.c +++ b/src/dns.c @@ -325,7 +325,7 @@ static int dns_init (void) return (-1); status = plugin_thread_create (&listen_thread, NULL, dns_child_loop, - (void *) 0); + (void *) 0, "dns listen"); if (status != 0) { char errbuf[1024]; diff --git a/src/email.c b/src/email.c index 1027eb90..334e8764 100644 --- a/src/email.c +++ b/src/email.c @@ -481,7 +481,8 @@ static void *open_connection (void __attribute__((unused)) *arg) 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))); @@ -568,7 +569,7 @@ static void *open_connection (void __attribute__((unused)) *arg) 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", diff --git a/src/exec.c b/src/exec.c index fc40d4a9..70b5fd04 100644 --- a/src/exec.c +++ b/src/exec.c @@ -852,7 +852,7 @@ static int exec_read (void) /* {{{ */ 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) */ @@ -894,7 +894,8 @@ static int exec_notification (const notification_t *n, /* {{{ */ 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) */ diff --git a/src/gmond.c b/src/gmond.c index 13ec6389..0743d8e1 100644 --- a/src/gmond.c +++ b/src/gmond.c @@ -892,7 +892,7 @@ static int mc_receive_thread_start (void) /* {{{ */ 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."); diff --git a/src/ipmi.c b/src/ipmi.c index 3267275d..24986b82 100644 --- a/src/ipmi.c +++ b/src/ipmi.c @@ -662,7 +662,7 @@ static int c_ipmi_init (void) 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; diff --git a/src/network.c b/src/network.c index 484e6100..6b43ae75 100644 --- a/src/network.c +++ b/src/network.c @@ -3477,7 +3477,7 @@ static int network_init (void) status = plugin_thread_create (&dispatch_thread_id, NULL /* no attributes */, dispatch_thread, - NULL /* no argument */); + NULL /* no argument */, "network dispatch"); if (status != 0) { char errbuf[1024]; @@ -3497,7 +3497,7 @@ static int network_init (void) 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]; diff --git a/src/pinba.c b/src/pinba.c index 5571ff26..ba8069da 100644 --- a/src/pinba.c +++ b/src/pinba.c @@ -638,7 +638,7 @@ static int plugin_init (void) /* {{{ */ status = plugin_thread_create (&collector_thread_id, /* attrs = */ NULL, collector_thread, - /* args = */ NULL); + /* args = */ NULL, "pinba collector"); if (status != 0) { char errbuf[1024]; diff --git a/src/ping.c b/src/ping.c index 64408491..66a254d5 100644 --- a/src/ping.c +++ b/src/ping.c @@ -392,7 +392,7 @@ static int start_thread (void) /* {{{ */ 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; diff --git a/src/python.c b/src/python.c index 5274262b..0dae99d8 100644 --- a/src/python.c +++ b/src/python.c @@ -1020,7 +1020,8 @@ static int cpy_init(void) { 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)) diff --git a/src/rrdtool.c b/src/rrdtool.c index f5e01c81..3d5ad9b9 100644 --- a/src/rrdtool.c +++ b/src/rrdtool.c @@ -1229,7 +1229,7 @@ static int rrd_init (void) 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."); diff --git a/src/sigrok.c b/src/sigrok.c index 78837cf8..6a8003c0 100644 --- a/src/sigrok.c +++ b/src/sigrok.c @@ -352,7 +352,7 @@ static int sigrok_init(void) } status = plugin_thread_create(&sr_thread, NULL, sigrok_read_thread, - NULL); + NULL, "sigrok read"); if (status != 0) { char errbuf[1024]; diff --git a/src/unixsock.c b/src/unixsock.c index 73037e49..4a7652ab 100644 --- a/src/unixsock.c +++ b/src/unixsock.c @@ -378,7 +378,7 @@ static void *us_server_thread (void __attribute__((unused)) *arg) 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 client"); if (status != 0) { char errbuf[1024]; @@ -459,7 +459,7 @@ static int us_init (void) loop = 1; status = plugin_thread_create (&listen_thread, NULL, - us_server_thread, NULL); + us_server_thread, NULL, "unixsock listener"); if (status != 0) { char errbuf[1024];