this is a direct fix of the issue revealing the problem that leads to crash
verification done with a patched icinga2 where the execution-order of the code lines of counter-parts involved in re-incrementing/decrementing Timer:Ptr is forced to be the one that leads to the obeserverd segfaults
refs #6737
void Timer::Call()
{
try {
- OnTimerExpired(Timer::Ptr(this));
+ OnTimerExpired(this);
} catch (...) {
InternalReschedule(true);
continue;
}
- Timer::Ptr ptimer = timer;
-
/* Remove the timer from the list so it doesn't get called again
* until the current call is completed. */
l_Timers.erase(timer);
lock.unlock();
/* Asynchronously call the timer. */
- Utility::QueueAsyncCallback(std::bind(&Timer::Call, ptimer));
+ Utility::QueueAsyncCallback(std::bind(&Timer::Call, timer));
}
}
void Reschedule(double next = -1);
double GetNext() const;
- boost::signals2::signal<void(const Timer::Ptr&)> OnTimerExpired;
+ boost::signals2::signal<void(const Timer * const&)> OnTimerExpired;
private:
double m_Interval{0}; /**< The interval of the timer. */
int counter = 0;
-static void Callback(const Timer::Ptr&)
+static void Callback(const Timer * const&)
{
counter++;
}