#include "ActionInitialization.hh" #include "EmitterPrimary.hh" #include "SteppingAction.hh" namespace uLib { namespace Geant { ActionInitialization::ActionInitialization(EmitterPrimary *emitter, SimulationContext *context) : G4VUserActionInitialization(), m_Emitter(emitter), m_Context(context) {} ActionInitialization::~ActionInitialization() {} // Lightweight wrapper to avoid double-free in Geant4 EventManager class SteppingActionWrapper : public G4UserSteppingAction { public: SteppingActionWrapper(SteppingAction *real) : m_Real(real) {} virtual void UserSteppingAction(const G4Step* step) override { m_Real->UserSteppingAction(step); } private: SteppingAction *m_Real; }; void ActionInitialization::BuildForMaster() const {} void ActionInitialization::Build() const { if (m_Emitter) { SetUserAction(m_Emitter->Clone()); } else { SetUserAction(new EmitterPrimary()); } SteppingAction *sa = new SteppingAction(m_Context); // EventManager will delete sa via this slot SetUserAction(static_cast(sa)); // EventManager will delete the wrapper, leaving sa alive to be deleted once. SetUserAction(new SteppingActionWrapper(sa)); } } // namespace Geant } // namespace uLib