diff options
author | Mohammed Suhail Munshi <MohammedSuhail.Munshi@arm.com> | 2024-01-10 14:29:46 +0000 |
---|---|---|
committer | Mohmun02 <MohammedSuhail.Munshi@arm.com> | 2024-01-12 11:01:32 +0000 |
commit | 27dee1e276dc8816a5b9f4e04d8b31d5c5816ca0 (patch) | |
tree | ff944e5c528f2f7d574883a3759426e50a9a8b5b /src/core | |
parent | 0eb9cfbe6e78f80008164cb0ee18afa09a7fe4eb (diff) | |
download | ComputeLibrary-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>
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/helpers/LUTManager.cpp | 10 |
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; |