aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammed Suhail Munshi <MohammedSuhail.Munshi@arm.com>2024-01-10 14:29:46 +0000
committerMohmun02 <MohammedSuhail.Munshi@arm.com>2024-01-12 11:01:32 +0000
commit27dee1e276dc8816a5b9f4e04d8b31d5c5816ca0 (patch)
treeff944e5c528f2f7d574883a3759426e50a9a8b5b
parent0eb9cfbe6e78f80008164cb0ee18afa09a7fe4eb (diff)
downloadComputeLibrary-27dee1e276dc8816a5b9f4e04d8b31d5c5816ca0.tar.gz
Fix potential threading issue in LUTManager
- Locks pointer before checking for validity to prevent race condition Signed-off-by: Mohammed Suhail Munshi <MohammedSuhail.Munshi@arm.com> Change-Id: I6872b10d058ee7f3707ba641f44bb6116e26880a Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/10960 Comments-Addressed: Arm Jenkins <bsgcomp@arm.com> Tested-by: Arm Jenkins <bsgcomp@arm.com> Reviewed-by: Viet-Hoa Do <viet-hoa.do@arm.com> Benchmark: Arm Jenkins <bsgcomp@arm.com>
-rw-r--r--src/core/helpers/LUTManager.cpp10
1 files 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<ActivationLayerInfo::LookupTable65536> 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<ActivationLayerInfo::LookupTable65536>();
+ // We do not use make_shared to prevent the weak_ptr keeping the control block alive
+ std::shared_ptr<ActivationLayerInfo::LookupTable65536> ptr(new ActivationLayerInfo::LookupTable65536);
init_lut_fp16(ptr.get());
map_fp16[info] = ptr;
return ptr;