From 8b60027f32717e69e4b2f1a59f2793938b7120ee Mon Sep 17 00:00:00 2001
From: Susumu Oda <susumu.oda@cern.ch>
Date: Mon, 17 Jun 2019 18:52:36 +0000
Subject: [PATCH] Move mutex to CacheEntry (SiDetElementsRoadMaker_xk)

---
 .../SiDetElementsRoadMaker_xk.h                      |  9 +++++----
 .../src/SiDetElementsRoadMaker_xk.cxx                | 12 ++++++------
 2 files changed, 11 insertions(+), 10 deletions(-)

diff --git a/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/SiDetElementsRoadTool_xk/SiDetElementsRoadMaker_xk.h b/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/SiDetElementsRoadTool_xk/SiDetElementsRoadMaker_xk.h
index a56a938bca3..f05fd2aa6e7 100644
--- a/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/SiDetElementsRoadTool_xk/SiDetElementsRoadMaker_xk.h
+++ b/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/SiDetElementsRoadTool_xk/SiDetElementsRoadMaker_xk.h
@@ -34,6 +34,7 @@
 #include "GaudiKernel/ServiceHandle.h"
 #include "GaudiKernel/ToolHandle.h"
 
+#include <atomic>
 #include <iosfwd>
 #include <list>
 #include <mutex>
@@ -127,13 +128,13 @@ namespace InDet{
     // This is not multithread safe.
     mutable std::atomic_bool m_test{};
 
-    // Mutex to protect the contents
-    mutable std::mutex m_mutex;
     // Cache
     struct CacheEntry {
+      // Mutex to protect the contents
+      std::mutex m_mutex;
       EventContext::ContextEvt_t m_evt{EventContext::INVALID_CONTEXT_EVT};
-      SiDetElementsLayerVectors_xk m_layerVectors{SiDetElementsLayerVectors_xk(3)};
       // std::vector<SiDetElementsLayer_xk> for each layer. This is not const.
+      SiDetElementsLayerVectors_xk m_layerVectors{SiDetElementsLayerVectors_xk(3)};
     };
     mutable SG::SlotSpecificObj<CacheEntry> m_cache ATLAS_THREAD_SAFE; // Guarded by m_mutex
 
@@ -149,7 +150,7 @@ namespace InDet{
 
     MsgStream& dumpConditions(MsgStream& out) const;
 
-    void getLayers(std::vector<SiDetElementsLayer_xk>* (&layer)[3]) const;
+    std::unique_lock<std::mutex> getLayers(std::vector<SiDetElementsLayer_xk>* (&layer)[3]) const;
   };
 
   MsgStream&    operator << (MsgStream&   , const SiDetElementsRoadMaker_xk&);
diff --git a/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/src/SiDetElementsRoadMaker_xk.cxx b/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/src/SiDetElementsRoadMaker_xk.cxx
index f53c2a632b2..8937981b222 100644
--- a/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/src/SiDetElementsRoadMaker_xk.cxx
+++ b/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/src/SiDetElementsRoadMaker_xk.cxx
@@ -130,8 +130,7 @@ MsgStream& InDet::SiDetElementsRoadMaker_xk::dumpConditions(MsgStream& out) cons
   s6.append("|");
 
   std::vector<SiDetElementsLayer_xk>* layer[3];
-  std::lock_guard<std::mutex> lock{m_mutex};
-  getLayers(layer);
+  std::unique_lock<std::mutex> lock{getLayers(layer)};
 
   int maps = 0;
   if (layer[0]->size()) ++maps;
@@ -313,9 +312,7 @@ void InDet::SiDetElementsRoadMaker_xk::detElementsRoad
   if (!m_usePIX && !m_useSCT) return;
 
   std::vector<SiDetElementsLayer_xk>* layer[3];
-  std::lock_guard<std::mutex> lock{m_mutex};
-  getLayers(layer);
-
+  std::unique_lock<std::mutex> lock{getLayers(layer)};
 
   std::list<Amg::Vector3D>::iterator g=GP.begin(), ge=GP.end();
   float Po[6] = {static_cast<float>((*g).x()), static_cast<float>((*g).y()), static_cast<float>((*g).z()),
@@ -747,9 +744,10 @@ Trk::CylinderBounds InDet::SiDetElementsRoadMaker_xk::getBound
   return CB;
 }
 
-void InDet::SiDetElementsRoadMaker_xk::getLayers(std::vector<SiDetElementsLayer_xk>* (&layer)[3]) const {
+std::unique_lock<std::mutex> InDet::SiDetElementsRoadMaker_xk::getLayers(std::vector<SiDetElementsLayer_xk>* (&layer)[3]) const {
   const EventContext& ctx{Gaudi::Hive::currentContext()};
   CacheEntry* ent{m_cache.get(ctx)};
+  std::unique_lock lock(ent->m_mutex);
   if (ent->m_evt!=ctx.evt()) {
     SG::ReadCondHandle<SiDetElementsLayerVectors_xk> layerVec{m_layerVecKey, ctx};
     if (not layerVec.isValid()) {
@@ -766,4 +764,6 @@ void InDet::SiDetElementsRoadMaker_xk::getLayers(std::vector<SiDetElementsLayer_
   layer[0] = &(ent->m_layerVectors[0]);
   layer[1] = &(ent->m_layerVectors[1]);
   layer[2] = &(ent->m_layerVectors[2]);
+
+  return lock;
 }
-- 
GitLab