+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]
/* Support for PTHREAD_MUTEX_ADAPTIVE_NP */
#undef HAVE_PTHREAD_MUTEX_ADAPTIVE_NP
+/* Define to 1 if you have the <pthread_np.h> 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
;;
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.
#
;;
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.
#
<section xml:id="relnotes_changes"><info><title>Feature Changes</title></info>
<itemizedlist>
+ <listitem>
+ <para>
+ Threads in <command>named</command> 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 <command>ps</command> and
+ <command>top</command>, but not the main thread. [RT #43234]
+ </para>
+ </listitem>
<listitem>
<para>
The Response Policy Zone (RPZ) implementation has been
<itemizedlist>
<listitem>
<para>
- 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]
- </para>
- </listitem>
- <listitem>
- <para>
- <command>named</command> could deadlock if multiple changes
- to NSEC/NSEC3 parameters for the same zone were being processed
- at the same time. [RT #42770]
- </para>
- </listitem>
- <listitem>
- <para>
- <command>named</command> could trigger an assertion when
- sending NOTIFY messages. [RT #44019]
- </para>
- </listitem>
- <listitem>
- <para>
- Referencing a nonexistent zone in a <command>response-policy</command>
- statement could cause an assertion failure during configuration.
- [RT #43787]
- </para>
- </listitem>
- <listitem>
- <para>
- <command>rndc addzone</command> could cause a crash
- when attempting to add a zone with a type other than
- <command>master</command> or <command>slave</command>.
- Such zones are now rejected. [RT #43665]
- </para>
- </listitem>
- <listitem>
- <para>
- <command>named</command> 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]
- </para>
- </listitem>
- <listitem>
- <para>
- If a zone was updated while <command>named</command> was
- processing a query for nonexistent data, it could return
- out-of-sync NSEC3 records causing potential DNSSEC validation
- failure. [RT #43247]
+ None.
</para>
</listitem>
</itemizedlist>
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)
isc_thread_setconcurrency(unsigned int level) {
UNUSED(level);
}
+
+void isc_thread_setname(isc_thread_t thread, const char *name) {
+ UNUSED(thread);
+ UNUSED(name);
+}
#include <pthread.h>
+#if defined(HAVE_PTHREAD_NP_H)
+#include <pthread_np.h>
+#endif
+
#include <isc/lang.h>
#include <isc/result.h>
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) \
#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)
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++;
}
ISC_MSG_FAILED, "failed"));
return (ISC_R_UNEXPECTED);
}
+ isc_thread_setname(manager->thread, "isc-timer");
#endif
#ifdef USE_SHARED_MANAGER
manager->refs = 1;
result = ISC_R_UNEXPECTED;
goto cleanup;
}
+ isc_thread_setname(manager->watcher, "isc-socket");
#endif /* USE_WATCHER_THREAD */
isc_mem_attach(mctx, &manager->mctx);
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 *));
isc_thread_key_getspecific
isc_thread_key_setspecific
isc_thread_setconcurrency
+isc_thread_setname
isc_time_add
isc_time_compare
isc_time_formatISO8601
*/
}
+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));