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:
committed by
Michał Kępień
parent
5759ace07f
commit
8e5e0fa522
@@ -154,6 +154,7 @@ libisc_la_SOURCES = \
|
||||
mem_p.h \
|
||||
meminfo.c \
|
||||
mutex.c \
|
||||
mutex_p.h \
|
||||
mutexblock.c \
|
||||
net.c \
|
||||
netaddr.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();
|
||||
}
|
||||
|
||||
@@ -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
22
lib/isc/mutex_p.h
Normal 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);
|
||||
Reference in New Issue
Block a user