diff --git a/MQ/mcbm/CbmDeviceDigiEventSink.cxx b/MQ/mcbm/CbmDeviceDigiEventSink.cxx index b2d6a15cab651cd10d1f7055a7fe5bbc6a26b3bc..ddedd7a31d3ee68245fca66d175e70469729d700 100644 --- a/MQ/mcbm/CbmDeviceDigiEventSink.cxx +++ b/MQ/mcbm/CbmDeviceDigiEventSink.cxx @@ -759,6 +759,16 @@ bool CbmDeviceDigiEventSink::SendHistograms() return true; } +//--------------------------------------------------------------------// +void CbmDeviceDigiEventSink::PostRun() +{ + // Needed to avoid due to other end of ZMQ channel being already gone if called during Finish/destructor + if (kTRUE == fbFillHistos) { + SendHistograms(); + fLastPublishTime = std::chrono::system_clock::now(); + } // if( kTRUE == fbFillHistos ) +} + //--------------------------------------------------------------------// CbmDeviceDigiEventSink::~CbmDeviceDigiEventSink() { @@ -787,14 +797,12 @@ void CbmDeviceDigiEventSink::Finish() LOG(info) << "Still buffered TS " << fmFullTsStorage.size() << " and still buffered empties " << fvulMissedTsIndices.size(); - if (kTRUE == fbFillHistos) { - SendHistograms(); - fLastPublishTime = std::chrono::system_clock::now(); - } // if( kTRUE == fbFillHistos ) - - ChangeState(fair::mq::Transition::Stop); - std::this_thread::sleep_for(std::chrono::milliseconds(3000)); - ChangeState(fair::mq::Transition::End); + if (fair::mq::State::Running == GetCurrentState()) { + /// Force state transitions only if not already done by ODC/DDS! + ChangeState(fair::mq::Transition::Stop); + std::this_thread::sleep_for(std::chrono::milliseconds(3000)); + ChangeState(fair::mq::Transition::End); + } fbFinishDone = kTRUE; } diff --git a/MQ/mcbm/CbmDeviceDigiEventSink.h b/MQ/mcbm/CbmDeviceDigiEventSink.h index 0d617899f45594e3c181dc506ac8ba9ac4ec703d..8c016409bc8f640a0d37cfb2661021d62bbb1165 100644 --- a/MQ/mcbm/CbmDeviceDigiEventSink.h +++ b/MQ/mcbm/CbmDeviceDigiEventSink.h @@ -93,6 +93,7 @@ protected: bool HandleMissTsData(FairMQMessagePtr&, int); bool HandleData(FairMQParts&, int); bool HandleCommand(FairMQMessagePtr&, int); + virtual void PostRun(); private: /// Constants