From dccbe3869754ee579773045bbc92222d55465ba4 Mon Sep 17 00:00:00 2001
From: Werner Wiedenmann <wiedenat@pcuwtr22d.cern.ch>
Date: Wed, 7 Oct 2020 19:32:48 +0200
Subject: [PATCH] Updates for HltROBDataProviderSvc

- try to release early possible locks in tbb::concurrent_unordered_map (see also ATR-22112)
- put clearing and size allocation for output arrays of the eventCache_checkRobListToCache function
  at the begin of the function
---
 .../src/HltROBDataProviderSvc.cxx             | 44 +++++++++++--------
 1 file changed, 25 insertions(+), 19 deletions(-)

diff --git a/HLT/Trigger/TrigControl/TrigServices/src/HltROBDataProviderSvc.cxx b/HLT/Trigger/TrigControl/TrigServices/src/HltROBDataProviderSvc.cxx
index 5745a8fe3e1..a9d7030af49 100644
--- a/HLT/Trigger/TrigControl/TrigServices/src/HltROBDataProviderSvc.cxx
+++ b/HLT/Trigger/TrigControl/TrigServices/src/HltROBDataProviderSvc.cxx
@@ -219,11 +219,9 @@ void HltROBDataProviderSvc::addROBData(const EventContext& context, const std::v
 
   // allocate vector of missing ROB Ids
   std::vector<uint32_t> robIds_missing ;
-  robIds_missing.reserve( robIds.size() ) ;
 
   // allocate vector with existing ROB fragments in cache
   std::vector<const ROBF*> robFragments_inCache ;
-  robFragments_inCache.reserve( robIds.size() ) ;
 
   // check input ROB list against cache
   eventCache_checkRobListToCache(cache,robIds, robFragments_inCache, robIds_missing ) ;
@@ -325,7 +323,6 @@ void HltROBDataProviderSvc::getROBData(const EventContext& context,
 
   // allocate vector of missing ROB Ids
   std::vector<uint32_t> robIds_missing ;
-  robIds_missing.reserve( robIds.size() ) ;
 
   // check input ROB list against cache
   eventCache_checkRobListToCache(cache, robIds, robFragments, robIds_missing) ;
@@ -375,8 +372,6 @@ void HltROBDataProviderSvc::getROBData(const EventContext& context,
   eventCache_addRobData(cache, robFragments_missing) ;
 
   // return all the requested ROB fragments from the cache
-  robFragments.clear() ;
-  robIds_missing.clear() ;
   eventCache_checkRobListToCache(cache, robIds, robFragments, robIds_missing) ;
 }
 
@@ -534,7 +529,7 @@ void HltROBDataProviderSvc::eventCache_clear(EventCache* cache)
   cache->globalEventNumber = 0;
   cache->eventStatus       = 0;    
   cache->isEventComplete   = false;    
-  cache->robmap.clear();
+  { cache->robmap.clear(); }
 }
 
 void HltROBDataProviderSvc::eventCache_checkRobListToCache(EventCache* cache, const std::vector<uint32_t>& robIds_toCheck, 
@@ -543,6 +538,15 @@ void HltROBDataProviderSvc::eventCache_checkRobListToCache(EventCache* cache, co
 {
   ATH_MSG_VERBOSE("start of " << __FUNCTION__ << " number of ROB Ids to check = " << robIds_toCheck.size());
 
+  // clear output arrays
+  robFragments_inCache.clear();
+  robIds_missing.clear();
+
+  // allocate sufficient space for output arrays
+  robFragments_inCache.reserve( robIds_toCheck.size() );
+  robIds_missing.reserve( robIds_toCheck.size() );
+
+  // check input ROB ids
   for (uint32_t id : robIds_toCheck) {
 
     // check for duplicate IDs on the list of missing ROBs
@@ -553,12 +557,13 @@ void HltROBDataProviderSvc::eventCache_checkRobListToCache(EventCache* cache, co
     }
 
     // check if ROB is already in cache
-    ROBMAP::const_iterator map_it = cache->robmap.find(id);
-    if (map_it != cache->robmap.end()) {
-      ATH_MSG_VERBOSE(__FUNCTION__ << " ROB Id 0x" << MSG::hex << id << MSG::dec
-		      << " found for (global Id, L1 Id) = (" << cache->globalEventNumber << "," << cache->currentLvl1ID <<")" );
-      robFragments_inCache.push_back( &(map_it->second) );
-      continue;
+    { ROBMAP::const_iterator map_it = cache->robmap.find(id);
+      if (map_it != cache->robmap.end()) {
+	ATH_MSG_VERBOSE(__FUNCTION__ << " ROB Id 0x" << MSG::hex << id << MSG::dec
+			<< " found for (global Id, L1 Id) = (" << cache->globalEventNumber << "," << cache->currentLvl1ID <<")" );
+	robFragments_inCache.push_back( &(map_it->second) );
+	continue;
+      }
     }
 
     // check if ROB is actually enabled for readout
@@ -603,11 +608,12 @@ void HltROBDataProviderSvc::eventCache_addRobData(EventCache* cache, const std::
     }
 
     // check if ROB is already in cache
-    ROBMAP::const_iterator it = cache->robmap.find(id);
-    if (it != cache->robmap.end()) {
-      ATH_MSG_VERBOSE(__FUNCTION__ << " Duplicate ROB Id 0x" << MSG::hex << id << MSG::dec
-		      << " found for (global Id, L1 Id) = (" << cache->globalEventNumber << "," << cache->currentLvl1ID <<")" );
-      continue;
+    { ROBMAP::const_iterator it = cache->robmap.find(id);
+      if (it != cache->robmap.end()) {
+	ATH_MSG_VERBOSE(__FUNCTION__ << " Duplicate ROB Id 0x" << MSG::hex << id << MSG::dec
+			<< " found for (global Id, L1 Id) = (" << cache->globalEventNumber << "," << cache->currentLvl1ID <<")" );
+	continue;
+      }
     }
 
     // check for ROBs with no data 
@@ -632,12 +638,12 @@ void HltROBDataProviderSvc::eventCache_addRobData(EventCache* cache, const std::
     }
 
     // add ROB to map
-    cache->robmap[id] = rob;
+    { cache->robmap[id] = rob; }
   }
 }
 
 HltROBDataProviderSvc::EventCache::~EventCache()
 {
   //  delete event;
-  robmap.clear();
+  { robmap.clear(); }
 }
-- 
GitLab