From 56ae875861ab260b80a030f50c4aff9f9dc8fff0 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sat, 13 Apr 2024 13:32:39 +0200 Subject: Adding upstream version 2.14.2. Signed-off-by: Daniel Baumann --- lib/base/timer.hpp | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 lib/base/timer.hpp (limited to 'lib/base/timer.hpp') diff --git a/lib/base/timer.hpp b/lib/base/timer.hpp new file mode 100644 index 0000000..db0f0b7 --- /dev/null +++ b/lib/base/timer.hpp @@ -0,0 +1,65 @@ +/* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */ + +#ifndef TIMER_H +#define TIMER_H + +#include "base/i2-base.hpp" +#include +#include + +namespace icinga { + +class TimerHolder; + +/** + * A timer that periodically triggers an event. + * + * @ingroup base + */ +class Timer final +{ +public: + typedef std::shared_ptr Ptr; + + static Ptr Create(); + + ~Timer(); + + static void Initialize(); + static void Uninitialize(); + static void InitializeThread(); + static void UninitializeThread(); + + void SetInterval(double interval); + double GetInterval() const; + + static void AdjustTimers(double adjustment); + + void Start(); + void Stop(bool wait = false); + + void Reschedule(double next = -1); + double GetNext() const; + + boost::signals2::signal OnTimerExpired; + +private: + double m_Interval{0}; /**< The interval of the timer. */ + double m_Next{0}; /**< When the next event should happen. */ + bool m_Started{false}; /**< Whether the timer is enabled. */ + bool m_Running{false}; /**< Whether the timer proc is currently running. */ + std::weak_ptr m_Self; + + Timer() = default; + void Call(); + void InternalReschedule(bool completed, double next = -1); + void InternalRescheduleUnlocked(bool completed, double next = -1); + + static void TimerThreadProc(); + + friend class TimerHolder; +}; + +} + +#endif /* TIMER_H */ -- cgit v1.2.3