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"
2728umf_memory_tracker_handle_t TRACKER = NULL ;
2829
2930static 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
3136static umf_ctl_node_t CTL_NODE (umf )[] = {CTL_CHILD (provider ), CTL_CHILD (pool ),
3237 CTL_NODE_END };
3338
3439void initialize_global_ctl (void ) { CTL_REGISTER_MODULE (NULL , umf ); }
3540
3641umf_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,14 +77,20 @@ umf_result_t umfInit(void) {
6377}
6478
6579umf_result_t umfTearDown (void ) {
66- if (utils_fetch_and_sub_u64 (& umfRefCount , 1 ) == 1 ) {
67- #if !defined(_WIN32 ) && !defined(UMF_NO_HWLOC )
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 ) {
6889 umfMemspaceHostAllDestroy ();
6990 umfMemspaceHighestCapacityDestroy ();
7091 umfMemspaceHighestBandwidthDestroy ();
7192 umfMemspaceLowestLatencyDestroy ();
7293 umfDestroyTopology ();
73- #endif
7494 umfIpcCacheGlobalTearDown ();
7595
7696 if (utils_is_running_in_proxy_lib_with_size_threshold ()) {
@@ -96,6 +116,7 @@ umf_result_t umfTearDown(void) {
96116 fini_tbb_global_state ();
97117 LOG_DEBUG ("UMF library finalized" );
98118 }
119+ utils_mutex_unlock (& initMutex );
99120 return UMF_RESULT_SUCCESS ;
100121}
101122
0 commit comments