diff --git a/CHANGES b/CHANGES index 4d67159f0976a3f1742ab40c6cbb13554a44d002..0e298ecbb902a183b0d90a087dbe0cb167174b20 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 597f9e6ff26c63ee39f78c4d32eac98ac82d0728..b7befbb5b81f8a030b221b176b0f2c514ab31897 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 956376a85e7c230a73ea1e85bcc00f6014edfa8d..3dac59d422cc3fc43e0a863815d10a0cdb2f3e3b 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 941123a37ab70f5617d9b493d593c89bc21de37d..bf388ff48dc0ef3b2c27e720b26088d8bb41c450 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 f52b11b6bf004933ac00106901c3c833b24d06f1..44aec4e82bfc3e80d3240ad9e59b00694f33f5c8 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 6ef7fd1782b15337aaea160d876bf810005c6ab9..bc11d3652557ec6be1027ba686e167d0be727207 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 1cf7700c091f4527efff1b5b758d2e0e9884f3b9..b697cf37111e26b7555fc24f63515a3ec5f42818 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 e44f5cbe351f03c64ebdcdaba9b5ca76be3b1508..57221c6be57b536ebcb3bd9fd6c0fdc6c5caa4b4 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 08286e2fce76c6e11abbd69de591e72fa334bd74..4caa7dde816b11c6cf63208271efe4fb7bfbaf0a 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 1fac0df21657c4e4ce1381ea322178af01bcc602..1c422845c54eaf335b6f6a5a8a042043ba0352ee 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 c7849f16af3c9b0381ad446e848dcce4ad82506d..79d463bf302b19c83d2de7ccf7af4f83047e9cb4 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 c1831c0528893060e56a820c2ea79cea56662c30..60fd7dd86db40bbd1497163c526090708d3b7dac 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 d1abfd9eeb7c7c3720905a3b71657cb85b8f81c8..6f1a715254ad2831b7f8d186273f8e549ddb5476 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 2bb4a3c0669055b09062229436f98ea8279817ee..a08de6db1445f522b01a6e1c482f9a4fee8f0eb9 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 996d7facf25462bc1591f3f63e9ecc86298ac5d6..39e83b1413cfd732db779ce459cc84ac309761d7 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));