diff --git a/Trigger/TrigMonitoring/TrigSteerMonitor/src/TrigSignatureMoniMT.cxx b/Trigger/TrigMonitoring/TrigSteerMonitor/src/TrigSignatureMoniMT.cxx index 65dfdf13ac5e54a459af76799c63445ae17740ba..1c6367b9e506cdf23098d6a5dc01eee907d5c58c 100644 --- a/Trigger/TrigMonitoring/TrigSteerMonitor/src/TrigSignatureMoniMT.cxx +++ b/Trigger/TrigMonitoring/TrigSteerMonitor/src/TrigSignatureMoniMT.cxx @@ -549,6 +549,7 @@ StatusCode TrigSignatureMoniMT::initBunchHist(LockedHandle<TH2>& hist, SG::ReadH return StatusCode::SUCCESS; } + TrigSignatureMoniMT::RateHistogram::~RateHistogram(){ delete m_bufferHistogram.get(); } @@ -589,6 +590,13 @@ void TrigSignatureMoniMT::RateHistogram::startTimer(unsigned int duration, unsig void TrigSignatureMoniMT::RateHistogram::stopTimer() { if (m_timer) { + m_stopCallback = true; + + // wait for the pending signals to be stopped + while (m_stopCallback) { + usleep(m_duration*50*1000); //microseconds + } + m_timer.reset(); time_t t = time(0); unsigned int interval; @@ -611,10 +619,13 @@ void TrigSignatureMoniMT::RateHistogram::callback() const { unsigned int newinterval; unsigned int oldinterval; - if ( m_timeDivider->isPassed(t, newinterval, oldinterval) ) { + if (m_timeDivider->isPassed(t, newinterval, oldinterval)) { updatePublished(m_duration); } - //schedule itself in another 1/20 of the integration period in milliseconds - if ( m_timer ) m_timer->start(m_duration*50); + //stop callback if timer is going to be deleted + //else schedule itself in another 1/20 of the integration period in milliseconds + if (bool exp=true; not m_stopCallback.compare_exchange_strong(exp,false)) { + m_timer->start(m_duration*50); + } } diff --git a/Trigger/TrigMonitoring/TrigSteerMonitor/src/TrigSignatureMoniMT.h b/Trigger/TrigMonitoring/TrigSteerMonitor/src/TrigSignatureMoniMT.h index 4ed41f5a1df2e076e24607e3043cb404cdba4edc..b8577dc9af617e0024b3fb2b030bcbae232cf23e 100644 --- a/Trigger/TrigMonitoring/TrigSteerMonitor/src/TrigSignatureMoniMT.h +++ b/Trigger/TrigMonitoring/TrigSteerMonitor/src/TrigSignatureMoniMT.h @@ -67,6 +67,7 @@ class TrigSignatureMoniMT : public extends<AthReentrantAlgorithm, IIncidentListe mutable LockedHandle<TH2> m_bufferHistogram; mutable LockedHandle<TH2> m_histogram; std::mutex m_mutex; + mutable std::atomic_bool m_stopCallback {false}; std::unique_ptr<Athena::AlgorithmTimer> m_timer; std::unique_ptr<TimeDivider> m_timeDivider; unsigned int m_duration;