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