diff --git a/lib/isc/Makefile.am b/lib/isc/Makefile.am index fb443b5d6e..b61c8c88f2 100644 --- a/lib/isc/Makefile.am +++ b/lib/isc/Makefile.am @@ -154,6 +154,7 @@ libisc_la_SOURCES = \ mem_p.h \ meminfo.c \ mutex.c \ + mutex_p.h \ mutexblock.c \ net.c \ netaddr.c \ diff --git a/lib/isc/lib.c b/lib/isc/lib.c index 7f6b12c4aa..dd42ea792b 100644 --- a/lib/isc/lib.c +++ b/lib/isc/lib.c @@ -21,6 +21,7 @@ #include "config.h" #include "mem_p.h" +#include "mutex_p.h" #include "os_p.h" #include "tls_p.h" #include "trampoline_p.h" @@ -41,6 +42,7 @@ isc__shutdown(void) ISC_DESTRUCTOR; void isc__initialize(void) { isc__os_initialize(); + isc__mutex_initialize(); isc__mem_initialize(); isc__tls_initialize(); isc__trampoline_initialize(); @@ -52,5 +54,6 @@ isc__shutdown(void) { isc__trampoline_shutdown(); isc__tls_shutdown(); isc__mem_shutdown(); + isc__mutex_shutdown(); isc__os_shutdown(); } diff --git a/lib/isc/mutex.c b/lib/isc/mutex.c index a73c276193..075fc37b32 100644 --- a/lib/isc/mutex.c +++ b/lib/isc/mutex.c @@ -26,32 +26,36 @@ #include #include -#ifdef HAVE_PTHREAD_MUTEX_ADAPTIVE_NP -static bool attr_initialized = false; -static pthread_mutexattr_t attr; -static isc_once_t once_attr = ISC_ONCE_INIT; +#include "mutex_p.h" + +pthread_mutexattr_t isc__mutex_init_attr; +static isc_once_t init_once = ISC_ONCE_INIT; static void -initialize_attr(void) { - RUNTIME_CHECK(pthread_mutexattr_init(&attr) == 0); - RUNTIME_CHECK(pthread_mutexattr_settype( - &attr, PTHREAD_MUTEX_ADAPTIVE_NP) == 0); - attr_initialized = true; -} +mutex_initialize(void) { + RUNTIME_CHECK(pthread_mutexattr_init(&isc__mutex_init_attr) == 0); +#ifdef 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 */ +} + +void +isc__mutex_initialize(void) { + RUNTIME_CHECK(isc_once_do(&init_once, mutex_initialize) == + ISC_R_SUCCESS); +} void isc__mutex_init(isc_mutex_t *mp) { int err; -#ifdef HAVE_PTHREAD_MUTEX_ADAPTIVE_NP - isc_result_t result = ISC_R_SUCCESS; - result = isc_once_do(&once_attr, initialize_attr); - RUNTIME_CHECK(result == ISC_R_SUCCESS); - - err = pthread_mutex_init(mp, &attr); -#else /* HAVE_PTHREAD_MUTEX_ADAPTIVE_NP */ - err = pthread_mutex_init(mp, NULL); -#endif /* HAVE_PTHREAD_MUTEX_ADAPTIVE_NP */ + err = pthread_mutex_init(mp, &isc__mutex_init_attr); ERRNO_CHECK(pthread_mutex_init, err); } + +void +isc__mutex_shutdown(void) { + /* noop */; +} diff --git a/lib/isc/mutex_p.h b/lib/isc/mutex_p.h new file mode 100644 index 0000000000..e9aa8a891b --- /dev/null +++ b/lib/isc/mutex_p.h @@ -0,0 +1,22 @@ +/* + * Copyright (C) Internet Systems Consortium, Inc. ("ISC") + * + * SPDX-License-Identifier: MPL-2.0 + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, you can obtain one at https://mozilla.org/MPL/2.0/. + * + * See the COPYRIGHT file distributed with this work for additional + * information regarding copyright ownership. + */ + +#pragma once + +/*! \file */ + +void +isc__mutex_initialize(void); + +void +isc__mutex_shutdown(void);