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"
@@ -34,35 +35,46 @@ static umf_ctl_node_t CTL_NODE(umf)[] = {CTL_CHILD(provider), CTL_CHILD(pool),
3435void initialize_global_ctl (void ) { CTL_REGISTER_MODULE (NULL , umf ); }
3536
3637int 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_size_t (& umfRefCount );
4363 }
4464
45- LOG_DEBUG ("UMF tracker created" );
65+ do {
66+ utils_atomic_load_acquire_u64 (& umfRefCount , & refCount );
67+ } while (refCount == 1 );
4668
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 );
5670
57- if (TRACKER ) {
58- LOG_DEBUG ("UMF library initialized" );
59- }
71+ LOG_DEBUG ("UMF library initialized" );
6072
6173 return 0 ;
6274}
6375
6476void umfTearDown (void ) {
65- if (utils_fetch_and_sub_u64 (& umfRefCount , 1 ) == 1 ) {
77+ if (utils_fetch_and_sub_u64 (& umfRefCount , 1 ) == 2 ) {
6678#if !defined(_WIN32 ) && !defined(UMF_NO_HWLOC )
6779 umfMemspaceHostAllDestroy ();
6880 umfMemspaceHighestCapacityDestroy ();
@@ -94,6 +106,7 @@ void umfTearDown(void) {
94106 fini_cu_global_state ();
95107 fini_tbb_global_state ();
96108 LOG_DEBUG ("UMF library finalized" );
109+ utils_atomic_decrement_size_t (& umfRefCount );
97110 }
98111}
99112
0 commit comments