From cc4f99bc6d6c82ed869caef1bccbb02821f9919d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Sur=C3=BD?= Date: Tue, 18 Jun 2024 15:21:52 +0200 Subject: [PATCH] Fix PTHREAD_MUTEX_ADAPTIVE_NP and PTHREAD_MUTEX_ERRORCHECK_NP usage The PTHREAD_MUTEX_ADAPTIVE_NP and PTHREAD_MUTEX_ERRORCHECK_NP are usually not defines, but enum values, so simple preprocessor check doesn't work. Check for PTHREAD_MUTEX_ADAPTIVE_NP from the autoconf AS_COMPILE_IFELSE block and define HAVE_PTHREAD_MUTEX_ADAPTIVE_NP. This should enable adaptive mutex on Linux and FreeBSD. As PTHREAD_MUTEX_ERRORCHECK actually comes from POSIX and Linux glibc does define it when compatibility macros are being set, we can just use PTHREAD_MUTEX_ERRORCHECK instead of PTHREAD_MUTEX_ERRORCHECK_NP. --- configure.ac | 8 ++++++++ lib/isc/mutex.c | 9 ++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/configure.ac b/configure.ac index 21404e6fcf..2de7d76f77 100644 --- a/configure.ac +++ b/configure.ac @@ -553,6 +553,14 @@ LIBS="$PTHREAD_LIBS $LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" CC="$PTHREAD_CC" +AC_MSG_CHECKING([for PTHREAD_MUTEX_ADAPTIVE_NP]) +AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[#include ]], + [[(void)pthread_mutexattr_settype(&(pthread_mutexattr_t){ NULL }, PTHREAD_MUTEX_ADAPTIVE_NP);]])], + [AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_PTHREAD_MUTEX_ADAPTIVE_NP], [1], [Define to 1 if PTHREAD_MUTEX_ADAPTIVE_NP is available])], + [AC_MSG_RESULT([no])]) + AC_CHECK_FUNCS([pthread_attr_getstacksize pthread_attr_setstacksize pthread_barrier_init pthread_spin_init]) AC_CHECK_HEADERS([sched.h]) diff --git a/lib/isc/mutex.c b/lib/isc/mutex.c index 67815eb7e9..e31ba1339c 100644 --- a/lib/isc/mutex.c +++ b/lib/isc/mutex.c @@ -33,15 +33,14 @@ static isc_once_t init_once = ISC_ONCE_INIT; static void mutex_initialize(void) { RUNTIME_CHECK(pthread_mutexattr_init(&isc__mutex_init_attr) == 0); -#if ISC_MUTEX_ERROR_CHECK && defined(PTHREAD_MUTEX_ERRORCHECK_NP) +#if ISC_MUTEX_ERROR_CHECK RUNTIME_CHECK(pthread_mutexattr_settype(&isc__mutex_init_attr, - PTHREAD_MUTEX_ERRORCHECK_NP) == - 0); -#elif defined(PTHREAD_MUTEX_ADAPTIVE_NP) + PTHREAD_MUTEX_ERRORCHECK) == 0); +#elif HAVE_PTHREAD_MUTEX_ADAPTIVE_NP RUNTIME_CHECK(pthread_mutexattr_settype(&isc__mutex_init_attr, PTHREAD_MUTEX_ADAPTIVE_NP) == 0); -#endif /* HAVE_PTHREAD_MUTEX_ADAPTIVE_NP */ +#endif } void