]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Use library constructor to create default mutex attr once
authorOndřej Surý <ondrej@isc.org>
Wed, 13 Jul 2022 11:19:32 +0000 (13:19 +0200)
committerMichał Kępień <michal@isc.org>
Wed, 13 Jul 2022 11:19:32 +0000 (13:19 +0200)
Instead of using isc_once_do() on every isc_mutex_init() call, use the
global library constructor to initialize the default mutex attr
object (optionally with PTHREAD_MUTEX_ADAPTIVE_NP if supported) just
once when the library is loaded.

lib/isc/Makefile.am
lib/isc/lib.c
lib/isc/mutex.c
lib/isc/mutex_p.h [new file with mode: 0644]

index fb443b5d6e6a605f18b28cb8ece7e0b64fef180a..b61c8c88f2e3b243c1ca4829a312eb14da671118 100644 (file)
@@ -154,6 +154,7 @@ libisc_la_SOURCES =         \
        mem_p.h                 \
        meminfo.c               \
        mutex.c                 \
+       mutex_p.h               \
        mutexblock.c            \
        net.c                   \
        netaddr.c               \
index 7f6b12c4aa08235c8e726cefc439f114e0e0f24b..dd42ea792bc60add69c14c9d1adfaf82d11d1ac5 100644 (file)
@@ -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();
 }
index a73c2761936eab1d468e86701c0fd90c8c9bcca2..075fc37b32395f5a7e6d5244af15c8e7c4f372b6 100644 (file)
 #include <isc/string.h>
 #include <isc/util.h>
 
-#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 (file)
index 0000000..e9aa8a8
--- /dev/null
@@ -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);