From f00d84599849c628735cff263cdf6d57874557df Mon Sep 17 00:00:00 2001 From: Evgeny Date: Thu, 7 Mar 2019 23:57:04 -0600 Subject: [PATCH] fix instance creation [ROCm/roctracer commit: 5dd9f0d9b25880af2e9966246ca7ef16afc3b3aa] --- projects/roctracer/src/core/loader.h | 26 +++++++++++++++-------- projects/roctracer/src/core/roctracer.cpp | 4 ++-- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/projects/roctracer/src/core/loader.h b/projects/roctracer/src/core/loader.h index 0df9b491fb..e23855e2a2 100644 --- a/projects/roctracer/src/core/loader.h +++ b/projects/roctracer/src/core/loader.h @@ -43,9 +43,13 @@ class HipLoader : protected Loader { typedef decltype(hipKernelNameRef) KernelNameRef_t; static HipLoader& Instance() { - std::lock_guard lck(mutex_); - if (instance_ == NULL) { - instance_ = new HipLoader(); + HipLoader* obj = instance_.load(std::memory_order_acquire); + if (obj == NULL) { + std::lock_guard lck(mutex_); + if (instance_.load(std::memory_order_relaxed) == NULL) { + obj = new HipLoader(); + instance_.store(obj, std::memory_order_release); + } } return *instance_; } @@ -65,7 +69,7 @@ class HipLoader : protected Loader { KernelNameRef_t* KernelNameRef; private: - static HipLoader* instance_; + static std::atomic instance_; }; // HCC runtime library loader class @@ -80,11 +84,15 @@ class HccLoader : protected Loader { static HccLoader* GetRef() { return instance_; } static HccLoader& Instance() { - std::lock_guard lck(mutex_); - if (instance_ == NULL) { - instance_ = new HccLoader(); + HccLoader* obj = instance_.load(std::memory_order_acquire); + if (obj == NULL) { + std::lock_guard lck(mutex_); + if (instance_.load(std::memory_order_relaxed) == NULL) { + obj = new HccLoader(); + instance_.store(obj, std::memory_order_release); + } } - return *instance_; + return *obj; } HccLoader() : Loader("libmcwamp.so") { @@ -101,7 +109,7 @@ class HccLoader : protected Loader { GetCmdName_t* GetCmdName; private: - static HccLoader* instance_; + static std::atomic instance_; }; } // namespace roctracer diff --git a/projects/roctracer/src/core/roctracer.cpp b/projects/roctracer/src/core/roctracer.cpp index 36821c5733..acb94c0cfd 100644 --- a/projects/roctracer/src/core/roctracer.cpp +++ b/projects/roctracer/src/core/roctracer.cpp @@ -441,8 +441,8 @@ typedef std::recursive_mutex memory_pool_mutex_t; memory_pool_mutex_t memory_pool_mutex; Loader::mutex_t Loader::mutex_; -HipLoader* HipLoader::instance_; -HccLoader* HccLoader::instance_; +std::atomic HipLoader::instance_{}; +std::atomic HccLoader::instance_{}; } proxy::Tracker* proxy::Tracker::instance_ = NULL;