Use library constructor to create default mutex attr once

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.
This commit is contained in:
Ondřej Surý
2022-07-13 13:19:32 +02:00
committed by Michał Kępień
parent 5759ace07f
commit 8e5e0fa522
4 changed files with 49 additions and 19 deletions

View File

@@ -154,6 +154,7 @@ libisc_la_SOURCES = \
mem_p.h \
meminfo.c \
mutex.c \
mutex_p.h \
mutexblock.c \
net.c \
netaddr.c \

View 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();
}

View File

@@ -26,32 +26,36 @@
#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 */;
}

22
lib/isc/mutex_p.h Normal file
View File

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