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>
diff --git a/src/core/helpers/LUTManager.cpp b/src/core/helpers/LUTManager.cpp
index 2bf0098..2f1746e 100644
--- a/src/core/helpers/LUTManager.cpp
+++ b/src/core/helpers/LUTManager.cpp
@@ -45,16 +45,18 @@
 
 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;