mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-09-05 09:05:40 +00:00
Some POSIX threads implementations (e.g. FreeBSD's libthr) allocate memory on the heap when pthread_mutex_init() is called. Every call to that function must be accompanied by a corresponding call to pthread_mutex_destroy() or else the memory allocated for the mutex will leak. jemalloc can be used for detecting memory allocations which are not released by a process when it exits. Unfortunately, since jemalloc is also the system allocator on FreeBSD and a special (profiling-enabled) build of jemalloc is required for memory leak detection, this method cannot be used for detecting leaked memory allocated by libthr on a stock FreeBSD installation. However, libthr's behavior can be emulated on any platform by implementing alternative versions of libisc functions for creating and destroying mutexes that allocate memory using malloc() and release it using free(). This enables using jemalloc for detecting missing pthread_mutex_destroy() calls on any platform on which it works reliably. Introduce a new ISC_TRACK_PTHREADS_OBJECTS preprocessor macro, which causes isc_mutex_t structures to be allocated on the heap by isc_mutex_init() and freed by isc_mutex_destroy(). Reuse existing mutex macros (after renaming them appropriately) for other operations.
54 lines
1.2 KiB
C
54 lines
1.2 KiB
C
/*
|
|
* 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.
|
|
*/
|
|
|
|
/*! \file */
|
|
|
|
#include <errno.h>
|
|
#include <stdbool.h>
|
|
#include <stdio.h>
|
|
#include <sys/time.h>
|
|
#include <time.h>
|
|
|
|
#include <isc/mutex.h>
|
|
#include <isc/once.h>
|
|
#include <isc/print.h>
|
|
#include <isc/strerr.h>
|
|
#include <isc/string.h>
|
|
#include <isc/util.h>
|
|
|
|
#include "mutex_p.h"
|
|
|
|
pthread_mutexattr_t isc__mutex_init_attr;
|
|
static isc_once_t init_once = ISC_ONCE_INIT;
|
|
|
|
static void
|
|
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_shutdown(void) {
|
|
/* noop */;
|
|
}
|