Merge pull request #2046 from rubenk/cleanup-dpdk-detection
authorRuben Kerkhof <ruben@rubenkerkhof.com>
Mon, 21 Nov 2016 13:37:53 +0000 (14:37 +0100)
committerGitHub <noreply@github.com>
Mon, 21 Nov 2016 13:37:53 +0000 (14:37 +0100)
Cleanup dpdk detection

18 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/gps.c
src/ipmi.c
src/mqtt.c
src/network.c
src/pinba.c
src/ping.c
src/python.c
src/rrdtool.c
src/sigrok.c
src/unixsock.c

index 54e4459..fedb26f 100644 (file)
@@ -214,7 +214,54 @@ AC_HEADER_SYS_WAIT
 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, [], [],
@@ -658,31 +705,6 @@ AC_CHECK_HEADERS(linux/un.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@:>@])],
@@ -1662,6 +1684,45 @@ 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([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
 #
index 882df7c..4089fc3 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 8b84e6a..d54abee 100644 (file)
@@ -25,6 +25,9 @@
  *   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>
 
 /*
@@ -116,7 +123,7 @@ static int             read_loop = 1;
 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;
@@ -644,7 +651,38 @@ static void *plugin_read_thread (void __attribute__((unused)) *args)
        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;
@@ -657,27 +695,35 @@ static void start_read_threads (int num)
        }
 
        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;
@@ -685,7 +731,7 @@ static void stop_read_threads (void)
        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)
                {
@@ -873,9 +919,7 @@ static void start_write_threads (size_t num) /* {{{ */
        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);
@@ -888,6 +932,10 @@ static void start_write_threads (size_t num) /* {{{ */
                        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 */
@@ -1777,7 +1825,7 @@ int plugin_init_all (void)
                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 */
@@ -2789,20 +2837,30 @@ 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 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 : */
index 5a4e4c7..9a9bf49 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 const *name);
 
 /*
  * Plugins need to implement this
index c8e794e..4a5c0fa 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 1027eb9..334e876 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 fc40d4a..70b5fd0 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 13ec638..0743d8e 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 b529422..81056e3 100644 (file)
--- a/src/gps.c
+++ b/src/gps.c
@@ -300,7 +300,7 @@ static int cgps_init (void)
          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.");
index 3267275..24986b8 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 c08fd29..32304f0 100644 (file)
@@ -776,7 +776,8 @@ static int mqtt_init (void)
         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];
index 484e610..d7eb32c 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 disp");
                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 5571ff2..ba8069d 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 6440849..66a254d 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 5274262..0dae99d 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 f5e01c8..3d5ad9b 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 78837cf..6a8003c 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 73037e4..2df4e09 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 conn");
                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 listen");
        if (status != 0)
        {
                char errbuf[1024];