diff --git a/Event/EventContainers/src/InternalOfflineFast.cxx b/Event/EventContainers/src/InternalOfflineFast.cxx index d3a799015a1db9bcd37499418c0ef409c6eeaf65..118d7c1df88584e54a7b96db1241ef61829aad4b 100644 --- a/Event/EventContainers/src/InternalOfflineFast.cxx +++ b/Event/EventContainers/src/InternalOfflineFast.cxx @@ -27,7 +27,8 @@ void InternalOfflineFast::wait() const { for(size_t i=0 ;i < m_fullMap.size(); ++i){ if(m_fullMap[i]) m_map.emplace_back(i, m_fullMap[i]); } - m_needsupdate.store(true); + m_map.shrink_to_fit(); + m_needsupdate.store(false); } std::vector<IdentifierHash> InternalOfflineFast::getAllCurrentHashes() const { @@ -70,7 +71,15 @@ size_t InternalOfflineFast::numberOfCollections() const { } void InternalOfflineFast::cleanUp(deleter_f* deleter) noexcept { - for(const auto& x : m_map) { deleter(x.second); m_fullMap[x.first] = nullptr; } + if(!m_needsupdate) { + for(const auto& x : m_map) { deleter(x.second); m_fullMap[x.first] = nullptr; } + if(!m_map.empty()) m_needsupdate.store(true, std::memory_order_relaxed); + } + else { + for(size_t i=0 ;i < m_fullMap.size(); ++i){ + if(m_fullMap[i]) deleter(m_fullMap[i]); + } + } m_map.clear(); } @@ -114,5 +123,10 @@ StatusCode InternalOfflineFast::fetchOrCreate(const std::vector<IdentifierHash>& } void InternalOfflineFast::destructor(deleter_f* deleter) noexcept { - for(const auto& x : m_map) deleter(x.second); + if(!m_needsupdate) for(const auto& x : m_map) deleter(x.second); + else { + for(size_t i=0 ;i < m_fullMap.size(); ++i){ + if(m_fullMap[i]) deleter(m_fullMap[i]); + } + } }