19
19
#include "provider_level_zero_internal.h"
20
20
#include "provider_tracking.h"
21
21
#include "utils_common.h"
22
+ #include "utils_concurrency.h"
22
23
#include "utils_log.h"
23
24
#if !defined(UMF_NO_HWLOC )
24
25
#include "topology.h"
27
28
umf_memory_tracker_handle_t TRACKER = NULL ;
28
29
29
30
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 ); }
30
35
31
36
static umf_ctl_node_t CTL_NODE (umf )[] = {CTL_CHILD (provider ), CTL_CHILD (pool ),
32
37
CTL_NODE_END };
33
38
34
39
void initialize_global_ctl (void ) { CTL_REGISTER_MODULE (NULL , umf ); }
35
40
36
41
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 ) {
38
47
utils_log_init ();
39
48
umf_result_t umf_result = umfMemoryTrackerCreate (& TRACKER );
40
49
if (umf_result != UMF_RESULT_SUCCESS ) {
41
50
LOG_ERR ("Failed to create memory tracker" );
51
+ utils_mutex_unlock (& initMutex );
42
52
return umf_result ;
43
53
}
44
54
@@ -48,13 +58,17 @@ umf_result_t umfInit(void) {
48
58
if (umf_result != UMF_RESULT_SUCCESS ) {
49
59
LOG_ERR ("Failed to initialize IPC cache" );
50
60
umfMemoryTrackerDestroy (TRACKER );
61
+ utils_mutex_unlock (& initMutex );
51
62
return umf_result ;
52
63
}
53
64
54
65
LOG_DEBUG ("UMF IPC cache initialized" );
55
66
initialize_global_ctl ();
56
67
}
57
68
69
+ umfRefCount ++ ;
70
+ utils_mutex_unlock (& initMutex );
71
+
58
72
if (TRACKER ) {
59
73
LOG_DEBUG ("UMF library initialized" );
60
74
}
@@ -63,7 +77,15 @@ umf_result_t umfInit(void) {
63
77
}
64
78
65
79
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 ) {
67
89
#if !defined(_WIN32 ) && !defined(UMF_NO_HWLOC )
68
90
umfMemspaceHostAllDestroy ();
69
91
umfMemspaceHighestCapacityDestroy ();
@@ -96,6 +118,7 @@ umf_result_t umfTearDown(void) {
96
118
fini_tbb_global_state ();
97
119
LOG_DEBUG ("UMF library finalized" );
98
120
}
121
+ utils_mutex_unlock (& initMutex );
99
122
return UMF_RESULT_SUCCESS ;
100
123
}
101
124
0 commit comments