From 27dee1e276dc8816a5b9f4e04d8b31d5c5816ca0 Mon Sep 17 00:00:00 2001 From: Mohammed Suhail Munshi Date: Wed, 10 Jan 2024 14:29:46 +0000 Subject: Fix potential threading issue in LUTManager - Locks pointer before checking for validity to prevent race condition Signed-off-by: Mohammed Suhail Munshi Change-Id: I6872b10d058ee7f3707ba641f44bb6116e26880a Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/10960 Comments-Addressed: Arm Jenkins Tested-by: Arm Jenkins Reviewed-by: Viet-Hoa Do Benchmark: Arm Jenkins --- src/core/helpers/LUTManager.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/core/helpers/LUTManager.cpp b/src/core/helpers/LUTManager.cpp index 2bf0098118..2f1746e31e 100644 --- a/src/core/helpers/LUTManager.cpp +++ b/src/core/helpers/LUTManager.cpp @@ -45,16 +45,18 @@ void init_lut_fp16(ActivationLayerInfo::LookupTable65536 *lut) std::shared_ptr LUTManager::get_lut_table(LUTInfo info) { - const auto itr = map_fp16.find(info); - if (itr != map_fp16.end() && !itr->second.expired()) + const auto itr = map_fp16.find(info); + auto s_ptr = (itr != map_fp16.end()) ? itr->second.lock() : nullptr; // nullptr if invalid or not found. + if (s_ptr != nullptr) { // Found and valid - return itr->second.lock(); // Return weak ptr as shared ptr + return s_ptr; // Return weak ptr as shared ptr } else { // Not found, or pointer not valid - const auto ptr = std::make_shared(); + // We do not use make_shared to prevent the weak_ptr keeping the control block alive + std::shared_ptr ptr(new ActivationLayerInfo::LookupTable65536); init_lut_fp16(ptr.get()); map_fp16[info] = ptr; return ptr; -- cgit v1.2.1