From 97caab40da5aee93bef600d1bd7cf0a5d9a20758 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Fri, 9 Oct 2020 05:42:53 -0400 Subject: [PATCH] SWDEV-255459 : to get rid of c++ libatomic Change-Id: I311db0e456dd6e6c87692898640574dc8f669086 --- src/CMakeLists.txt | 2 +- src/core/activity.cpp | 33 +++++++++++++++++++++------------ 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ccbe31cbbf..dbe00cd990 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -35,4 +35,4 @@ set ( LIB_SRC ) add_library ( ${TARGET_LIB} SHARED ${LIB_SRC} ) target_include_directories ( ${TARGET_LIB} PRIVATE ${LIB_DIR} ${ROOT_DIR} ${HSA_RUNTIME_INC_PATH} ${HSA_KMT_LIB_PATH}/.. ) -target_link_libraries( ${TARGET_LIB} PRIVATE ${HSA_RUNTIME_LIB} c stdc++ atomic ) +target_link_libraries( ${TARGET_LIB} PRIVATE ${HSA_RUNTIME_LIB} c stdc++ ) diff --git a/src/core/activity.cpp b/src/core/activity.cpp index d777a3a8a9..2071b5cf6c 100644 --- a/src/core/activity.cpp +++ b/src/core/activity.cpp @@ -173,31 +173,40 @@ PUBLIC_API bool EnableActivityCallback(uint32_t op, bool enable) { } struct evt_cb_entry_t { - void* callback; - void* arg; + typedef std::pair data_t; + data_t data; + std::mutex mutex; + + void set(const data_t& in) { + mutex.lock(); + data = in; + mutex.unlock(); + } + data_t get() { + mutex.lock(); + const data_t out = data; + mutex.unlock(); + return out; + } + evt_cb_entry_t() : data{} {} }; -typedef std::atomic evt_cb_entry_atomic_t; -evt_cb_entry_atomic_t evt_cb_table[HSA_EVT_ID_NUMBER]{}; +evt_cb_entry_t evt_cb_table[HSA_EVT_ID_NUMBER]; hsa_status_t codeobj_evt_callback( rocprofiler_hsa_cb_id_t id, const rocprofiler_hsa_callback_data_t* cb_data, void* arg) { - evt_cb_entry_t evt = evt_cb_table[id].load(std::memory_order_relaxed); - activity_rtapi_callback_t evt_callback = (activity_rtapi_callback_t)evt.callback; - - if (evt_callback != NULL) { - evt_callback(ACTIVITY_DOMAIN_HSA_EVT, id, cb_data, evt.arg); - } - + const auto evt = evt_cb_table[id].get(); + activity_rtapi_callback_t evt_callback = (activity_rtapi_callback_t)evt.first; + if (evt_callback != NULL) evt_callback(ACTIVITY_DOMAIN_HSA_EVT, id, cb_data, evt.second); return HSA_STATUS_SUCCESS; } PUBLIC_API const char* GetEvtName(uint32_t op) { return strdup("CODEOBJ"); } PUBLIC_API bool RegisterEvtCallback(uint32_t op, void* callback, void* arg) { - evt_cb_table[op].store(evt_cb_entry_t{callback, arg}, std::memory_order_relaxed); + evt_cb_table[op].set({callback, arg}); rocprofiler_hsa_callbacks_t ocb{}; switch (op) {