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