fix: dev: 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.

Merge branch 'ondrej/fix-adaptive-mutex-use' into 'main'

See merge request isc-projects/bind9!9111
This commit is contained in:
Ondřej Surý
2024-08-05 07:31:54 +00:00
3 changed files with 12 additions and 23 deletions

View File

@@ -553,14 +553,15 @@ LIBS="$PTHREAD_LIBS $LIBS"
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
CC="$PTHREAD_CC"
AC_CHECK_FUNCS([pthread_attr_getstacksize pthread_attr_setstacksize pthread_barrier_init pthread_spin_init])
AC_MSG_CHECKING([for PTHREAD_MUTEX_ADAPTIVE_NP])
AC_COMPILE_IFELSE(
[AC_LANG_PROGRAM([[#include <pthread.h>]],
[[(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])])
# [pairwise: --with-locktype=adaptive, --with-locktype=standard]
AC_ARG_WITH([locktype],
AS_HELP_STRING([--with-locktype=ARG],
[Specify mutex lock type
(adaptive or standard)]),
[], [with_locktype="adaptive"])
AC_CHECK_FUNCS([pthread_attr_getstacksize pthread_attr_setstacksize pthread_barrier_init pthread_spin_init])
AC_CHECK_HEADERS([sched.h])
@@ -1712,9 +1713,6 @@ report() {
if test "yes" = "$enable_full_report" -o "rbt" = "$zonedb"; then
echo " Default cache database type: $cachedb"
fi
if test "yes" = "$enable_full_report" -o "standard" = "$with_locktype"; then
echo " Mutex lock type: $with_locktype"
fi
test "no" = "$enable_dnstap" || \
echo " Allow 'dnstap' packet logging (--enable-dnstap)"
test -z "$MAXMINDDB_LIBS" || echo " GeoIP2 access control (--enable-geoip)"

View File

@@ -23,14 +23,6 @@
#include <isc/result.h> /* for ISC_R_ codes */
#include <isc/util.h>
#if ISC_MUTEX_ERROR_CHECK && defined(PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP)
#define ISC_MUTEX_INITIALIZER PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP
#elif defined(PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP)
#define ISC_MUTEX_INITIALIZER PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP
#else
#define ISC_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
#endif
ISC_LANG_BEGINDECLS
/*

View File

@@ -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