Merge branch 'ondrej/use-error-checking-mutex-on-linux' into 'main'

Always use adaptive mutexes on Linux and use error checking mutexes in developer mode

See merge request isc-projects/bind9!8693
This commit is contained in:
Ondřej Surý
2024-02-07 21:55:31 +00:00
5 changed files with 12 additions and 30 deletions

View File

@@ -171,7 +171,7 @@ AC_ARG_ENABLE([developer],
AS_IF([test "$enable_developer" = "yes"],
[DEVELOPER_MODE=yes
STD_CPPFLAGS="$STD_CPPFLAGS -DISC_MEM_DEFAULTFILL=1 -DISC_MEM_TRACKLINES=1 -DISC_LIST_CHECKINIT=1 -DISC_STATS_CHECKUNDERFLOW=1 -DDNS_RBTDB_STRONG_RWLOCK_CHECK=1"
STD_CPPFLAGS="$STD_CPPFLAGS -DISC_MEM_DEFAULTFILL=1 -DISC_MEM_TRACKLINES=1 -DISC_LIST_CHECKINIT=1 -DISC_STATS_CHECKUNDERFLOW=1 -DDNS_RBTDB_STRONG_RWLOCK_CHECK=1 -DISC_MUTEX_ERROR_CHECK=1"
test "${enable_fixed_rrset+set}" = set || enable_fixed_rrset=yes
test "${enable_querytrace+set}" = set || enable_querytrace=yes
test "${with_cmocka+set}" = set || with_cmocka=yes
@@ -562,30 +562,6 @@ AC_ARG_WITH([locktype],
(adaptive or standard)]),
[], [with_locktype="adaptive"])
AS_CASE([$with_locktype],
[adaptive],[
AC_MSG_CHECKING([for PTHREAD_MUTEX_ADAPTIVE_NP])
AC_COMPILE_IFELSE(
[AC_LANG_PROGRAM(
[[
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#include <pthread.h>
]],
[[
return (PTHREAD_MUTEX_ADAPTIVE_NP);
]]
)],
[AC_MSG_RESULT([using adaptive lock type])
AC_DEFINE([HAVE_PTHREAD_MUTEX_ADAPTIVE_NP], 1,
[Support for PTHREAD_MUTEX_ADAPTIVE_NP]) ],
[AC_MSG_RESULT([using standard lock type])]
)],
[standard],[AC_MSG_RESULT([using standard lock type])],
[AC_MSG_ERROR([You must specify "adaptive" or "standard" for --with-locktype.])]
)
AC_CHECK_HEADERS([sched.h])
AC_SEARCH_LIBS([sched_yield],[rt])

View File

@@ -23,7 +23,13 @@
#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,7 +33,11 @@ static isc_once_t init_once = ISC_ONCE_INIT;
static void
mutex_initialize(void) {
RUNTIME_CHECK(pthread_mutexattr_init(&isc__mutex_init_attr) == 0);
#ifdef HAVE_PTHREAD_MUTEX_ADAPTIVE_NP
#if ISC_MUTEX_ERROR_CHECK && defined(PTHREAD_MUTEX_ERRORCHECK_NP)
RUNTIME_CHECK(pthread_mutexattr_settype(&isc__mutex_init_attr,
PTHREAD_MUTEX_ERRORCHECK_NP) ==
0);
#elif defined(PTHREAD_MUTEX_ADAPTIVE_NP)
RUNTIME_CHECK(pthread_mutexattr_settype(&isc__mutex_init_attr,
PTHREAD_MUTEX_ADAPTIVE_NP) ==
0);

View File

@@ -328,7 +328,6 @@ struct isc_nm {
isc_mem_t *mctx;
isc_loopmgr_t *loopmgr;
uint32_t nloops;
isc_mutex_t lock;
isc__networker_t *workers;
isc_stats_t *stats;

View File

@@ -179,7 +179,6 @@ isc_netmgr_create(isc_mem_t *mctx, isc_loopmgr_t *loopmgr, isc_nm_t **netmgrp) {
};
isc_mem_attach(mctx, &netmgr->mctx);
isc_mutex_init(&netmgr->lock);
isc_refcount_init(&netmgr->references, 1);
atomic_init(&netmgr->maxudp, 0);
atomic_init(&netmgr->shuttingdown, false);
@@ -253,8 +252,6 @@ nm_destroy(isc_nm_t **mgr0) {
isc_stats_detach(&mgr->stats);
}
isc_mutex_destroy(&mgr->lock);
isc_mem_cput(mgr->mctx, mgr->workers, mgr->nloops,
sizeof(mgr->workers[0]));
isc_mem_putanddetach(&mgr->mctx, mgr, sizeof(*mgr));