diff --git a/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/ISF_Geant4Tools/ATLAS_CHECK_THREAD_SAFETY b/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/ISF_Geant4Tools/ATLAS_CHECK_THREAD_SAFETY new file mode 100644 index 0000000000000000000000000000000000000000..bed242395f558e4a01558e0307c022b47e007f12 --- /dev/null +++ b/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/ISF_Geant4Tools/ATLAS_CHECK_THREAD_SAFETY @@ -0,0 +1 @@ +Simulation/ISF/ISF_Geant4/ISF_Geant4Tools diff --git a/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/MCTruthUserAction.cxx b/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/MCTruthUserAction.cxx index 8c97095aaf66e20db9d8cd49ff5e8f29babb5a34..0fb46c259af9ae01aaadf5e2367dbefa79475981 100644 --- a/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/MCTruthUserAction.cxx +++ b/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/MCTruthUserAction.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration */ /////////////////////////////////////////////////////////////////// @@ -58,10 +58,8 @@ namespace G4UA{ } void MCTruthUserAction::PreUserTrackingAction(const G4Track* inTrack){ - //ATH_MSG_DEBUG("Starting to track a new particle"); - G4Track* inT = const_cast<G4Track*> (inTrack); - TrackHelper trackHelper(inT); + TrackHelper trackHelper(inTrack); if (trackHelper.IsPrimary() || (trackHelper.IsRegisteredSecondary()&&m_config.ilevel>1) || @@ -72,14 +70,13 @@ namespace G4UA{ trkMgr->SetStoreTrajectory(true); trkMgr->SetTrajectory(temp); - // TODO: check that the 'temp' obeject is actually deleted by the G4TrackingManager + // TODO: check that the 'temp' object is actually deleted by the G4TrackingManager // after FADS::FadsTrackingAction::GetTrackingAction()->ResetTraj() is executed } } void MCTruthUserAction::PostUserTrackingAction(const G4Track*){ - //ATH_MSG_DEBUG("Finished tracking a particle"); G4EventManager::GetEventManager()->GetTrackingManager()->SetStoreTrajectory(false); } } // namespace iGeant4 diff --git a/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/TrackProcessorUserActionBase.cxx b/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/TrackProcessorUserActionBase.cxx index 16159963c4b2300b8cf5dcac7d0d3c8b4fcb13ce..c14ee66ea0099fbdaa756a3a25ceb487822b4d19 100644 --- a/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/TrackProcessorUserActionBase.cxx +++ b/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/TrackProcessorUserActionBase.cxx @@ -20,6 +20,7 @@ // Athena includes #include "AtlasDetDescr/AtlasRegion.h" +#include "CxxUtils/checker_macros.h" #include "MCTruth/AtlasG4EventUserInfo.h" #include "MCTruth/PrimaryParticleInformation.h" @@ -86,7 +87,7 @@ void TrackProcessorUserActionBase::UserSteppingAction(const G4Step* aStep) const std::vector<const G4Track*> *secondaryVector = aStep->GetSecondaryInCurrentStep(); for ( auto* aConstSecondaryTrack : *secondaryVector ) { // get a non-const G4Track for current secondary (nasty!) - G4Track* aSecondaryTrack = const_cast<G4Track*>( aConstSecondaryTrack ); + G4Track* aSecondaryTrack ATLAS_THREAD_SAFE = const_cast<G4Track*>( aConstSecondaryTrack ); // imposed by Geant4 interface auto *trackInfo = ::iGeant4::ISFG4Helper::getISFTrackInfo(*aSecondaryTrack); @@ -108,7 +109,7 @@ void TrackProcessorUserActionBase::PreUserTrackingAction(const G4Track* aTrack) { bool isPrimary = ! aTrack->GetParentID(); if (isPrimary) { - G4Track* nonConstTrack = const_cast<G4Track*> (aTrack); // love it :) + G4Track* nonConstTrack ATLAS_THREAD_SAFE = const_cast<G4Track*> (aTrack); // imposed by Geant4 interface setupPrimary(*nonConstTrack); } else { setupSecondary(*aTrack); diff --git a/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/TrackProcessorUserActionPassBack.cxx b/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/TrackProcessorUserActionPassBack.cxx index 3765dcfd482f4e6e686087774f6d4cb479d21b40..298269fcf3cf88b42a57caa652827c82103fa7f6 100644 --- a/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/TrackProcessorUserActionPassBack.cxx +++ b/Simulation/ISF/ISF_Geant4/ISF_Geant4Tools/src/TrackProcessorUserActionPassBack.cxx @@ -21,6 +21,8 @@ // Athena includes #include "AtlasDetDescr/AtlasRegion.h" +#include "CxxUtils/checker_macros.h" +#include "StoreGate/StoreGateSvc.h" // MCTruth includes #include "MCTruth/TrackBarcodeInfo.h" @@ -29,8 +31,6 @@ #include "MCTruth/TrackInformation.h" #include "MCTruth/VTrackInformation.h" -#include "StoreGate/StoreGateSvc.h" - // Geant4 includes #include "G4ParticleDefinition.hh" #include "G4DynamicParticle.hh" @@ -186,7 +186,7 @@ namespace G4UA { // loop over new secondaries for ( auto* aConstTrack_2nd : *secondaryVector ) { // get a non-const G4Track for current secondary (nasty!) - G4Track *aTrack_2nd = const_cast<G4Track*>( aConstTrack_2nd ); + G4Track *aTrack_2nd ATLAS_THREAD_SAFE = const_cast<G4Track*>( aConstTrack_2nd ); // imposed by Geant4 interface // check if new secondary position is behind boundary const G4ThreeVector& pos_2nd = aTrack_2nd->GetPosition(); @@ -286,10 +286,11 @@ namespace G4UA { trackInfo->SetBaseISFParticle( newISP ); // push the particle back to ISF via the particle broker - // in MT mode there is no broker if ( m_particleBrokerQuick ) { - m_particleBrokerQuick->push(newISP, parentISP); + [&] ATLAS_NOT_THREAD_SAFE () { // suppress checker warning, in MT mode there is no broker + m_particleBrokerQuick->push(newISP, parentISP); + }(); } else {