]> granicus.if.org Git - icinga2/commitdiff
Start and stop the timer thread lazily 6467/head
authorAlexander A. Klimov <alexander.klimov@icinga.com>
Fri, 20 Jul 2018 13:36:15 +0000 (15:36 +0200)
committerAlexander A. Klimov <alexander.klimov@icinga.com>
Fri, 20 Jul 2018 13:36:15 +0000 (15:36 +0200)
refs #6461

lib/base/timer.cpp
lib/base/timer.hpp

index 65c7ee6266b099bfa4a7581eeb25af3f506bc283..d5e748cfa4716ff2507bf86cf954da14e05b72ce 100644 (file)
@@ -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);
 
index 0c661593de12874d9895534e8791f002dc6fa033..7a0c1f9811ca1ef33510cb5c1b57663b8c80f330 100644 (file)
@@ -42,6 +42,8 @@ public:
 
        static void Initialize();
        static void Uninitialize();
+       static void InitializeThread();
+       static void UninitializeThread();
 
        void SetInterval(double interval);
        double GetInterval() const;