From ec3210008c3ccb18e6ffaed4ef61c4d66de21626 Mon Sep 17 00:00:00 2001
From: Markus Frank <Markus.Frank@cern.ch>
Date: Mon, 12 Jun 2023 18:04:11 +0200
Subject: [PATCH] Protect DDDigi edm4hep output against races

---
 DDDigi/io/DigiEdm4hepOutput.cpp | 31 ++++++++++++++++++++-----------
 1 file changed, 20 insertions(+), 11 deletions(-)

diff --git a/DDDigi/io/DigiEdm4hepOutput.cpp b/DDDigi/io/DigiEdm4hepOutput.cpp
index 34170052a..3a80639d8 100644
--- a/DDDigi/io/DigiEdm4hepOutput.cpp
+++ b/DDDigi/io/DigiEdm4hepOutput.cpp
@@ -146,27 +146,36 @@ namespace dd4hep {
 
     /// Clear local data content
     void DigiEdm4hepOutput::internals_t::clear()   {
+#if 0
       m_header.second->clear();
       m_particles.second->clear();
       for( const auto& c : m_tracker_collections )
         c.second->clear();
       for( const auto& c : m_calo_collections )
         c.second->clear();
+#endif
+      *m_header.second = {};
+      *m_particles.second = {};
+      for( const auto& c : m_tracker_collections )
+        *c.second = {};
+      for( const auto& c : m_calo_collections )
+        *c.second = {};
     }
 
     /// Commit data at end of filling procedure
     void DigiEdm4hepOutput::internals_t::commit()   {
-      if ( m_writer )   {
-        std::lock_guard<std::mutex> protection(m_lock);
-        podio::Frame frame { };
-        frame.put( std::move(*m_header.second), m_header.first);
-        frame.put( std::move(*m_particles.second), m_particles.first);
-        for( const auto& c : m_tracker_collections )
-          frame.put( std::move(*c.second), c.first);
-        for( const auto& c : m_calo_collections )
-          frame.put( std::move(*c.second), c.first);
-
-        m_writer->writeFrame(frame, m_section_name);
+      if ( m_writer )   {{
+          std::lock_guard<std::mutex> protection(m_lock);
+          podio::Frame frame { };
+          frame.put( std::move(*m_header.second), m_header.first);
+          frame.put( std::move(*m_particles.second), m_particles.first);
+          for( const auto& c : m_tracker_collections )
+            frame.put( std::move(*c.second), c.first);
+          for( const auto& c : m_calo_collections )
+            frame.put( std::move(*c.second), c.first);
+
+          m_writer->writeFrame(frame, m_section_name);
+        }
         clear();
         return;
       }
-- 
GitLab