Code

Add support to set the thread name.
authorManuel Luis SanmartĂ­n Rozada <manuel.luis@gmail.com>
Sat, 8 Feb 2014 22:13:01 +0000 (23:13 +0100)
committerMarc Fournier <marc.fournier@camptocamp.com>
Wed, 16 Nov 2016 06:39:55 +0000 (07:39 +0100)
16 files changed:
configure.ac
src/amqp.c
src/daemon/plugin.c
src/daemon/plugin.h
src/dns.c
src/email.c
src/exec.c
src/gmond.c
src/ipmi.c
src/network.c
src/pinba.c
src/ping.c
src/python.c
src/rrdtool.c
src/sigrok.c
src/unixsock.c

index ac738f80ff813201f43fce310f24a14e6bd642b2..db1754345a5dbba4ffc829e0740cd0d2f9e5193c 100644 (file)
@@ -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 <pthread.h>
+#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 <pthread.h>
+#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
 #
index 882df7c576d0bc513afa54c87c18d58278b880c1..4089fc321ee5e04510e66fa1f1274a55d450cd2a 100644 (file)
@@ -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];
index 8b84e6a7920583c48ea3f6570dc9a900b9ec79d6..987f40aaf431c030de6cff4b3b4007b72c806d72 100644 (file)
@@ -25,6 +25,7 @@
  *   Sebastian Harl <sh at tokkee.org>
  **/
 
+#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 : */
index 5a4e4c75af12679c0c84c68b7b0892c5a7cc0c0a..0f4d267c75149ad8017df77012a72e7988a53348 100644 (file)
@@ -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
index c8e794eb032f83dd786455767819214548c758a3..4a5c0fa39c4f966ef03c17b53d3a95f352b032ff 100644 (file)
--- 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];
index 1027eb90ad1fed60e77219fa8b71dc399ab315e7..334e8764bb3de27a7bfa843adf6d88ae2616a166 100644 (file)
@@ -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",
index fc40d4a9eff65e1d1300e2160466e9e6d01402b9..70b5fd0400cfb133fbf51d66039ebfbbbd4de36b 100644 (file)
@@ -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) */
 
index 13ec638950151403bcdee841fb45523c565a34ec..0743d8e1f42e95a983ec6aafd44bfb80fbc152f9 100644 (file)
@@ -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.");
index 3267275dadac14d21f24a592658cd952cd829188..24986b820a04fca868430a91f711bb24f5bcf45d 100644 (file)
@@ -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;
index 484e610053bc3d4248c127de9e82a32dcd693f52..6b43ae75b47982609ffbeb702488c1d554e1e049 100644 (file)
@@ -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];
index 5571ff2600b3cd98c5f1c236323fe97d50db26c5..ba8069da3fafdf492de6756b6a7885b23c62c468 100644 (file)
@@ -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];
index 64408491d410c71b7d4f6322b60de8175139660c..66a254d52d9d5ded6fd39dab3d0279523548b0b1 100644 (file)
@@ -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;
index 5274262bbd6b5826ca40b8ec6940a20a7ea297cb..0dae99d8242f69804a2c2b3e1ffee2e96b132aa9 100644 (file)
@@ -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))
index f5e01c81fe522d4fba76842156540594a24d3ef3..3d5ad9b90ff3a77afd90305e50ee27709fdf93af 100644 (file)
@@ -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.");
index 78837cf825a18b57990726e3a84e5f44a1ce663e..6a8003c076e49cec33ac2e3e95cae0c4486de196 100644 (file)
@@ -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];
index 73037e49b2e2b7a05739139c92911e1d3a33734d..4a7652ab5a1f4d924902eb5229285db84b81d561 100644 (file)
@@ -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];