From d26ae7fc0802f67a50f6f01152f356182d47305e Mon Sep 17 00:00:00 2001 From: Evan Hunt Date: Fri, 21 Apr 2017 13:58:22 -0700 Subject: [PATCH] [master] give threads unique names to assist debugging 4602. [func] Threads are now set to human-readable names to assist debugging, when supported by the OS. [RT #43234] --- CHANGES | 4 ++ config.h.in | 9 ++++ configure | 26 +++++++++++ configure.in | 4 ++ doc/arm/notes.xml | 60 +++++--------------------- lib/isc/nothreads/include/isc/thread.h | 3 ++ lib/isc/nothreads/thread.c | 5 +++ lib/isc/pthreads/include/isc/thread.h | 7 +++ lib/isc/pthreads/thread.c | 16 +++++++ lib/isc/task.c | 4 ++ lib/isc/timer.c | 1 + lib/isc/unix/socket.c | 1 + lib/isc/win32/include/isc/thread.h | 3 ++ lib/isc/win32/libisc.def.in | 1 + lib/isc/win32/thread.c | 6 +++ 15 files changed, 101 insertions(+), 49 deletions(-) diff --git a/CHANGES b/CHANGES index 4d67159f09..0e298ecbb9 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,7 @@ +4602. [func] Threads are now set to human-readable + names to assist debugging, when supported by + the OS. [RT #43234] + 4601. [bug] Reject incorrect RSA key lengths during key generation and and sign/verify context creation. [RT #45043] diff --git a/config.h.in b/config.h.in index 597f9e6ff2..b7befbb5b8 100644 --- a/config.h.in +++ b/config.h.in @@ -383,6 +383,15 @@ int sigwait(const unsigned int *set, int *sig); /* Support for PTHREAD_MUTEX_ADAPTIVE_NP */ #undef HAVE_PTHREAD_MUTEX_ADAPTIVE_NP +/* Define to 1 if you have the header file. */ +#undef HAVE_PTHREAD_NP_H + +/* Define to 1 if you have the `pthread_setname_np' function. */ +#undef HAVE_PTHREAD_SETNAME_NP + +/* Define to 1 if you have the `pthread_set_name_np' function. */ +#undef HAVE_PTHREAD_SET_NAME_NP + /* Define to 1 if you have the `pthread_yield' function. */ #undef HAVE_PTHREAD_YIELD diff --git a/configure b/configure index 956376a85e..3dac59d422 100755 --- a/configure +++ b/configure @@ -15665,6 +15665,32 @@ fi ;; esac + # Look for functions relating to thread naming + for ac_func in pthread_setname_np pthread_set_name_np +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + for ac_header in pthread_np.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "pthread_np.h" "ac_cv_header_pthread_np_h" "$ac_includes_default" +if test "x$ac_cv_header_pthread_np_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_PTHREAD_NP_H 1 +_ACEOF + +fi + +done + + # # Look for sysconf to allow detection of the number of processors. # diff --git a/configure.in b/configure.in index 941123a37a..bf388ff48d 100644 --- a/configure.in +++ b/configure.in @@ -1351,6 +1351,10 @@ then ;; esac + # Look for functions relating to thread naming + AC_CHECK_FUNCS(pthread_setname_np pthread_set_name_np) + AC_CHECK_HEADERS(pthread_np.h) + # # Look for sysconf to allow detection of the number of processors. # diff --git a/doc/arm/notes.xml b/doc/arm/notes.xml index f52b11b6bf..44aec4e82b 100644 --- a/doc/arm/notes.xml +++ b/doc/arm/notes.xml @@ -266,6 +266,16 @@
Feature Changes + + + Threads in named are now set to human-readable + names to assist debugging on operating systems that support that. + Threads will have names such as "isc-timer", "isc-sockmgr", + "isc-worker0001", and so on. This will affect the reporting of + subsidiary thread names in ps and + top, but not the main thread. [RT #43234] + + The Response Policy Zone (RPZ) implementation has been @@ -313,55 +323,7 @@ - A synthesized CNAME record appearing in a response before the - associated DNAME could be cached, when it should not have been. - This was a regression introduced while addressing CVE-2016-8864. - [RT #44318] - - - - - named could deadlock if multiple changes - to NSEC/NSEC3 parameters for the same zone were being processed - at the same time. [RT #42770] - - - - - named could trigger an assertion when - sending NOTIFY messages. [RT #44019] - - - - - Referencing a nonexistent zone in a response-policy - statement could cause an assertion failure during configuration. - [RT #43787] - - - - - rndc addzone could cause a crash - when attempting to add a zone with a type other than - master or slave. - Such zones are now rejected. [RT #43665] - - - - - named could hang when encountering log - file names with large apparent gaps in version number (for - example, when files exist called "logfile.0", "logfile.1", - and "logfile.1482954169"). This is now handled correctly. - [RT #38688] - - - - - If a zone was updated while named was - processing a query for nonexistent data, it could return - out-of-sync NSEC3 records causing potential DNSSEC validation - failure. [RT #43247] + None. diff --git a/lib/isc/nothreads/include/isc/thread.h b/lib/isc/nothreads/include/isc/thread.h index 6ef7fd1782..bc11d36525 100644 --- a/lib/isc/nothreads/include/isc/thread.h +++ b/lib/isc/nothreads/include/isc/thread.h @@ -19,6 +19,9 @@ ISC_LANG_BEGINDECLS void isc_thread_setconcurrency(unsigned int level); +void +isc_thread_setname(isc_thread_t, const char *); + #define isc_thread_self() ((unsigned long)0) #define isc_thread_yield() ((void)0) diff --git a/lib/isc/nothreads/thread.c b/lib/isc/nothreads/thread.c index 1cf7700c09..b697cf3711 100644 --- a/lib/isc/nothreads/thread.c +++ b/lib/isc/nothreads/thread.c @@ -17,3 +17,8 @@ void isc_thread_setconcurrency(unsigned int level) { UNUSED(level); } + +void isc_thread_setname(isc_thread_t thread, const char *name) { + UNUSED(thread); + UNUSED(name); +} diff --git a/lib/isc/pthreads/include/isc/thread.h b/lib/isc/pthreads/include/isc/thread.h index e44f5cbe35..57221c6be5 100644 --- a/lib/isc/pthreads/include/isc/thread.h +++ b/lib/isc/pthreads/include/isc/thread.h @@ -15,6 +15,10 @@ #include +#if defined(HAVE_PTHREAD_NP_H) +#include +#endif + #include #include @@ -35,6 +39,9 @@ isc_thread_setconcurrency(unsigned int level); void isc_thread_yield(void); +void +isc_thread_setname(isc_thread_t, const char *); + /* XXX We could do fancier error handling... */ #define isc_thread_join(t, rp) \ diff --git a/lib/isc/pthreads/thread.c b/lib/isc/pthreads/thread.c index 08286e2fce..4caa7dde81 100644 --- a/lib/isc/pthreads/thread.c +++ b/lib/isc/pthreads/thread.c @@ -70,6 +70,22 @@ isc_thread_setconcurrency(unsigned int level) { #endif } +void +isc_thread_setname(isc_thread_t thread, const char *name) { +#if defined(HAVE_PTHREAD_SETNAME_NP) && defined(_GNU_SOURCE) + /* + * macOS has pthread_setname_np but only works on the + * current thread so it's not used here + */ + (void)pthread_setname_np(thread, name); +#elif defined(HAVE_PTHREAD_SET_NAME_NP) + (void)pthread_set_name_np(thread, name); +#else + UNUSED(thread); + UNUSED(name); +#endif +} + void isc_thread_yield(void) { #if defined(HAVE_SCHED_YIELD) diff --git a/lib/isc/task.c b/lib/isc/task.c index 1fac0df216..1c422845c5 100644 --- a/lib/isc/task.c +++ b/lib/isc/task.c @@ -1449,6 +1449,10 @@ isc__taskmgr_create(isc_mem_t *mctx, unsigned int workers, if (isc_thread_create(run, manager, &manager->threads[manager->workers]) == ISC_R_SUCCESS) { + char name[16]; /* thread name limit on Linux */ + snprintf(name, sizeof(name), "isc-worker%04d", i); + isc_thread_setname(manager->threads[manager->workers], + name); manager->workers++; started++; } diff --git a/lib/isc/timer.c b/lib/isc/timer.c index c7849f16af..79d463bf30 100644 --- a/lib/isc/timer.c +++ b/lib/isc/timer.c @@ -914,6 +914,7 @@ isc__timermgr_create(isc_mem_t *mctx, isc_timermgr_t **managerp) { ISC_MSG_FAILED, "failed")); return (ISC_R_UNEXPECTED); } + isc_thread_setname(manager->thread, "isc-timer"); #endif #ifdef USE_SHARED_MANAGER manager->refs = 1; diff --git a/lib/isc/unix/socket.c b/lib/isc/unix/socket.c index c1831c0528..60fd7dd86d 100644 --- a/lib/isc/unix/socket.c +++ b/lib/isc/unix/socket.c @@ -4772,6 +4772,7 @@ isc__socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp, result = ISC_R_UNEXPECTED; goto cleanup; } + isc_thread_setname(manager->watcher, "isc-socket"); #endif /* USE_WATCHER_THREAD */ isc_mem_attach(mctx, &manager->mctx); diff --git a/lib/isc/win32/include/isc/thread.h b/lib/isc/win32/include/isc/thread.h index d1abfd9eeb..6f1a715254 100644 --- a/lib/isc/win32/include/isc/thread.h +++ b/lib/isc/win32/include/isc/thread.h @@ -74,6 +74,9 @@ isc_thread_join(isc_thread_t, isc_threadresult_t *); void isc_thread_setconcurrency(unsigned int level); +void +isc_thread_setname(isc_thread_t, const char *); + int isc_thread_key_create(isc_thread_key_t *key, void (*func)(void *)); diff --git a/lib/isc/win32/libisc.def.in b/lib/isc/win32/libisc.def.in index 2bb4a3c066..a08de6db14 100644 --- a/lib/isc/win32/libisc.def.in +++ b/lib/isc/win32/libisc.def.in @@ -705,6 +705,7 @@ isc_thread_key_delete isc_thread_key_getspecific isc_thread_key_setspecific isc_thread_setconcurrency +isc_thread_setname isc_time_add isc_time_compare isc_time_formatISO8601 diff --git a/lib/isc/win32/thread.c b/lib/isc/win32/thread.c index 996d7facf2..39e83b1413 100644 --- a/lib/isc/win32/thread.c +++ b/lib/isc/win32/thread.c @@ -58,6 +58,12 @@ isc_thread_setconcurrency(unsigned int level) { */ } +void +isc_thread_setname(isc_thread_t thread, const char *name) { + UNUSED(thread); + UNUSED(name); +} + void * isc_thread_key_getspecific(isc_thread_key_t key) { return(TlsGetValue(key)); -- GitLab