From: Alexander A. Klimov Date: Fri, 20 Jul 2018 13:36:15 +0000 (+0200) Subject: Start and stop the timer thread lazily X-Git-Tag: v2.9.1~2^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=refs%2Fpull%2F6467%2Fhead;p=icinga2 Start and stop the timer thread lazily refs #6461 --- diff --git a/lib/base/timer.cpp b/lib/base/timer.cpp index 65c7ee626..d5e748cfa 100644 --- a/lib/base/timer.cpp +++ b/lib/base/timer.cpp @@ -72,6 +72,7 @@ static boost::condition_variable l_TimerCV; static std::thread l_TimerThread; static bool l_StopTimerThread; static TimerSet l_Timers; +static int l_AliveTimers = 0; /** * Destructor for the Timer class. @@ -84,20 +85,40 @@ Timer::~Timer() void Timer::Initialize() { boost::mutex::scoped_lock lock(l_TimerMutex); + + if (l_AliveTimers > 0) { + InitializeThread(); + } +} + +void Timer::Uninitialize() +{ + boost::mutex::scoped_lock lock(l_TimerMutex); + + if (l_AliveTimers > 0) { + UninitializeThread(); + } +} + +void Timer::InitializeThread() +{ l_StopTimerThread = false; l_TimerThread = std::thread(&Timer::TimerThreadProc); } -void Timer::Uninitialize() +void Timer::UninitializeThread() { { - boost::mutex::scoped_lock lock(l_TimerMutex); l_StopTimerThread = true; l_TimerCV.notify_all(); } + l_TimerMutex.unlock(); + if (l_TimerThread.joinable()) l_TimerThread.join(); + + l_TimerMutex.lock(); } /** @@ -146,6 +167,10 @@ void Timer::Start() { boost::mutex::scoped_lock lock(l_TimerMutex); m_Started = true; + + if (++l_AliveTimers == 1) { + InitializeThread(); + } } InternalReschedule(false); @@ -161,6 +186,10 @@ void Timer::Stop(bool wait) boost::mutex::scoped_lock lock(l_TimerMutex); + if (m_Started && --l_AliveTimers == 0) { + UninitializeThread(); + } + m_Started = false; l_Timers.erase(this); diff --git a/lib/base/timer.hpp b/lib/base/timer.hpp index 0c661593d..7a0c1f981 100644 --- a/lib/base/timer.hpp +++ b/lib/base/timer.hpp @@ -42,6 +42,8 @@ public: static void Initialize(); static void Uninitialize(); + static void InitializeThread(); + static void UninitializeThread(); void SetInterval(double interval); double GetInterval() const;