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"
@@ -34,35 +35,46 @@ static umf_ctl_node_t CTL_NODE(umf)[] = {CTL_CHILD(provider), CTL_CHILD(pool),
34
35
void initialize_global_ctl (void ) { CTL_REGISTER_MODULE (NULL , umf ); }
35
36
36
37
int umfInit (void ) {
37
- if (utils_fetch_and_add_u64 (& umfRefCount , 1 ) == 0 ) {
38
- utils_log_init ();
39
- TRACKER = umfMemoryTrackerCreate ();
40
- if (!TRACKER ) {
41
- LOG_ERR ("Failed to create memory tracker" );
42
- return -1 ;
38
+ uint64_t refCount ;
39
+ do {
40
+ if (utils_fetch_and_add_u64 (& umfRefCount , 1 ) == 0 ) {
41
+ utils_log_init ();
42
+ TRACKER = umfMemoryTrackerCreate ();
43
+ if (!TRACKER ) {
44
+ LOG_ERR ("Failed to create memory tracker" );
45
+ utils_atomic_decrement_size_t (& umfRefCount );
46
+ return -1 ;
47
+ }
48
+
49
+ LOG_DEBUG ("UMF tracker created" );
50
+
51
+ umf_result_t umf_result = umfIpcCacheGlobalInit ();
52
+ if (umf_result != UMF_RESULT_SUCCESS ) {
53
+ LOG_ERR ("Failed to initialize IPC cache" );
54
+ umfMemoryTrackerDestroy (TRACKER );
55
+ utils_atomic_decrement_size_t (& umfRefCount );
56
+ return -1 ;
57
+ }
58
+
59
+ LOG_DEBUG ("UMF IPC cache initialized" );
60
+ initialize_global_ctl ();
61
+
62
+ utils_atomic_increment_u64 (& umfRefCount );
43
63
}
44
64
45
- LOG_DEBUG ("UMF tracker created" );
65
+ do {
66
+ utils_atomic_load_acquire_u64 (& umfRefCount , & refCount );
67
+ } while (refCount == 1 );
46
68
47
- umf_result_t umf_result = umfIpcCacheGlobalInit ();
48
- if (umf_result != UMF_RESULT_SUCCESS ) {
49
- LOG_ERR ("Failed to initialize IPC cache" );
50
- return -1 ;
51
- }
52
-
53
- LOG_DEBUG ("UMF IPC cache initialized" );
54
- initialize_global_ctl ();
55
- }
69
+ } while (refCount < 2 );
56
70
57
- if (TRACKER ) {
58
- LOG_DEBUG ("UMF library initialized" );
59
- }
71
+ LOG_DEBUG ("UMF library initialized" );
60
72
61
73
return 0 ;
62
74
}
63
75
64
76
void umfTearDown (void ) {
65
- if (utils_fetch_and_sub_u64 (& umfRefCount , 1 ) == 1 ) {
77
+ if (utils_fetch_and_sub_u64 (& umfRefCount , 1 ) == 2 ) {
66
78
#if !defined(_WIN32 ) && !defined(UMF_NO_HWLOC )
67
79
umfMemspaceHostAllDestroy ();
68
80
umfMemspaceHighestCapacityDestroy ();
@@ -94,6 +106,7 @@ void umfTearDown(void) {
94
106
fini_cu_global_state ();
95
107
fini_tbb_global_state ();
96
108
LOG_DEBUG ("UMF library finalized" );
109
+ utils_atomic_decrement_u64 (& umfRefCount );
97
110
}
98
111
}
99
112
0 commit comments