Skip to content
Snippets Groups Projects
Commit 8b60027f authored by Susumu Oda's avatar Susumu Oda Committed by Vakhtang Tsulaia
Browse files

Move mutex to CacheEntry (SiDetElementsRoadMaker_xk)

parent 5740c83f
No related branches found
No related tags found
No related merge requests found
......@@ -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&);
......
......@@ -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;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment