diff --git a/Trigger/TrigT1/TrigT1CaloByteStream/src/L1CaloErrorByteStreamTool.cxx b/Trigger/TrigT1/TrigT1CaloByteStream/src/L1CaloErrorByteStreamTool.cxx index 7c48d50ee4f55d17e2ab6b556d7cd739a6925196..caac9a69428facdeda4280c992a29e474fcb2b71 100644 --- a/Trigger/TrigT1/TrigT1CaloByteStream/src/L1CaloErrorByteStreamTool.cxx +++ b/Trigger/TrigT1/TrigT1CaloByteStream/src/L1CaloErrorByteStreamTool.cxx @@ -60,10 +60,12 @@ StatusCode L1CaloErrorByteStreamTool::finalize() // Set ROB status error void L1CaloErrorByteStreamTool::robError(const uint32_t robid, - const unsigned int err) + const unsigned int err) const { - if (err && m_robMap.find(robid) == m_robMap.end()) { - m_robMap.insert(std::make_pair(robid, err)); + ErrorMaps& maps = *m_maps; + std::scoped_lock lock (maps.m_mutex); + if (err && maps.m_robMap.find(robid) == maps.m_robMap.end()) { + maps.m_robMap.insert(std::make_pair(robid, err)); } return; } @@ -71,10 +73,12 @@ void L1CaloErrorByteStreamTool::robError(const uint32_t robid, // Set ROD unpacking error void L1CaloErrorByteStreamTool::rodError(const uint32_t robid, - const unsigned int err) + const unsigned int err) const { - if (err && m_rodMap.find(robid) == m_rodMap.end()) { - m_rodMap.insert(std::make_pair(robid, err)); + ErrorMaps& maps = *m_maps; + std::scoped_lock lock (maps.m_mutex); + if (err && maps.m_rodMap.find(robid) == maps.m_rodMap.end()) { + maps.m_rodMap.insert(std::make_pair(robid, err)); } return; } @@ -84,22 +88,24 @@ void L1CaloErrorByteStreamTool::rodError(const uint32_t robid, StatusCode L1CaloErrorByteStreamTool::errors(std::vector<unsigned int>* const errColl) { - if (!m_robMap.empty() || !m_rodMap.empty()) { - errColl->push_back(m_robMap.size()); - ErrorMap::const_iterator iter = m_robMap.begin(); - ErrorMap::const_iterator iterE = m_robMap.end(); + ErrorMaps& maps = *m_maps; + std::scoped_lock lock (maps.m_mutex); + if (!maps.m_robMap.empty() || !maps.m_rodMap.empty()) { + errColl->push_back(maps.m_robMap.size()); + ErrorMap::const_iterator iter = maps.m_robMap.begin(); + ErrorMap::const_iterator iterE = maps.m_robMap.end(); for (; iter != iterE; ++iter) { errColl->push_back(iter->first); errColl->push_back(iter->second); } - m_robMap.clear(); - iter = m_rodMap.begin(); - iterE = m_rodMap.end(); + maps.m_robMap.clear(); + iter = maps.m_rodMap.begin(); + iterE = maps.m_rodMap.end(); for (; iter != iterE; ++iter) { errColl->push_back(iter->first); errColl->push_back(iter->second); } - m_rodMap.clear(); + maps.m_rodMap.clear(); } return StatusCode::SUCCESS; } diff --git a/Trigger/TrigT1/TrigT1CaloByteStream/src/L1CaloErrorByteStreamTool.h b/Trigger/TrigT1/TrigT1CaloByteStream/src/L1CaloErrorByteStreamTool.h index 6bbf24809402f715209db43e0932aa8c13633090..27fadc8e2d70b459fb8b76a7aeaddc942477e84f 100644 --- a/Trigger/TrigT1/TrigT1CaloByteStream/src/L1CaloErrorByteStreamTool.h +++ b/Trigger/TrigT1/TrigT1CaloByteStream/src/L1CaloErrorByteStreamTool.h @@ -12,6 +12,7 @@ #include <vector> #include "AthenaBaseComps/AthAlgTool.h" +#include "AthenaKernel/SlotSpecificObj.h" class IInterface; class InterfaceID; @@ -34,23 +35,27 @@ class L1CaloErrorByteStreamTool : public AthAlgTool { /// AlgTool InterfaceID static const InterfaceID& interfaceID(); - virtual StatusCode initialize(); - virtual StatusCode finalize(); + virtual StatusCode initialize() override; + virtual StatusCode finalize() override; /// Set ROB status error - void robError(uint32_t robid, unsigned int err); + void robError(uint32_t robid, unsigned int err) const; /// Set ROD unpacking error - void rodError(uint32_t robid, unsigned int err); + void rodError(uint32_t robid, unsigned int err) const; /// Fill vector with accumulated errors and reset StatusCode errors(std::vector<unsigned int>* errColl); private: - // Maps of accumulated errors + // FIXME: do this in a sane way... typedef std::map<uint32_t, unsigned int> ErrorMap; - ErrorMap m_robMap; - ErrorMap m_rodMap; - + struct ErrorMaps { + // Maps of accumulated errors + ErrorMap m_robMap; + ErrorMap m_rodMap; + std::mutex m_mutex; + }; + mutable SG::SlotSpecificObj<ErrorMaps> m_maps; }; } // end namespace