Skip to content

Commit 11e5e98

Browse files
committed
make umfInit threadsafe
1 parent a2a0919 commit 11e5e98

File tree

1 file changed

+25
-2
lines changed

1 file changed

+25
-2
lines changed

src/libumf.c

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "provider_level_zero_internal.h"
2020
#include "provider_tracking.h"
2121
#include "utils_common.h"
22+
#include "utils_concurrency.h"
2223
#include "utils_log.h"
2324
#if !defined(UMF_NO_HWLOC)
2425
#include "topology.h"
@@ -27,18 +28,27 @@
2728
umf_memory_tracker_handle_t TRACKER = NULL;
2829

2930
static uint64_t umfRefCount = 0;
31+
static utils_mutex_t initMutex;
32+
static UTIL_ONCE_FLAG initMutexOnce = UTIL_ONCE_FLAG_INIT;
33+
34+
static void initialize_init_mutex(void) { utils_mutex_init(&initMutex); }
3035

3136
static umf_ctl_node_t CTL_NODE(umf)[] = {CTL_CHILD(provider), CTL_CHILD(pool),
3237
CTL_NODE_END};
3338

3439
void initialize_global_ctl(void) { CTL_REGISTER_MODULE(NULL, umf); }
3540

3641
umf_result_t umfInit(void) {
37-
if (utils_fetch_and_add_u64(&umfRefCount, 1) == 0) {
42+
utils_init_once(&initMutexOnce, initialize_init_mutex);
43+
44+
utils_mutex_lock(&initMutex);
45+
46+
if (umfRefCount == 0) {
3847
utils_log_init();
3948
umf_result_t umf_result = umfMemoryTrackerCreate(&TRACKER);
4049
if (umf_result != UMF_RESULT_SUCCESS) {
4150
LOG_ERR("Failed to create memory tracker");
51+
utils_mutex_unlock(&initMutex);
4252
return umf_result;
4353
}
4454

@@ -48,13 +58,17 @@ umf_result_t umfInit(void) {
4858
if (umf_result != UMF_RESULT_SUCCESS) {
4959
LOG_ERR("Failed to initialize IPC cache");
5060
umfMemoryTrackerDestroy(TRACKER);
61+
utils_mutex_unlock(&initMutex);
5162
return umf_result;
5263
}
5364

5465
LOG_DEBUG("UMF IPC cache initialized");
5566
initialize_global_ctl();
5667
}
5768

69+
umfRefCount++;
70+
utils_mutex_unlock(&initMutex);
71+
5872
if (TRACKER) {
5973
LOG_DEBUG("UMF library initialized");
6074
}
@@ -63,7 +77,15 @@ umf_result_t umfInit(void) {
6377
}
6478

6579
umf_result_t umfTearDown(void) {
66-
if (utils_fetch_and_sub_u64(&umfRefCount, 1) == 1) {
80+
utils_init_once(&initMutexOnce, initialize_init_mutex);
81+
82+
utils_mutex_lock(&initMutex);
83+
if (umfRefCount == 0) {
84+
utils_mutex_unlock(&initMutex);
85+
return UMF_RESULT_SUCCESS;
86+
}
87+
88+
if (--umfRefCount == 0) {
6789
#if !defined(_WIN32) && !defined(UMF_NO_HWLOC)
6890
umfMemspaceHostAllDestroy();
6991
umfMemspaceHighestCapacityDestroy();
@@ -96,6 +118,7 @@ umf_result_t umfTearDown(void) {
96118
fini_tbb_global_state();
97119
LOG_DEBUG("UMF library finalized");
98120
}
121+
utils_mutex_unlock(&initMutex);
99122
return UMF_RESULT_SUCCESS;
100123
}
101124

0 commit comments

Comments
 (0)