mirror of
https://github.com/isc-projects/bind9.git
synced 2026-04-15 22:09:31 -04:00
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:
parent
5759ace07f
commit
8e5e0fa522
4 changed files with 49 additions and 19 deletions
|
|
@ -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);
|
||||
Loading…
Reference in a new issue