Merge pull request #6467 from Icinga/bugfix/test-runner-does-not-clean-up-6461

Start and stop the timer thread lazily
This commit is contained in:
Michael Friedrich 2018-07-23 11:35:48 +02:00 committed by GitHub
commit 95d46f57c3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 34 additions and 3 deletions

View 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);
l_StopTimerThread = false;
l_TimerThread = std::thread(&Timer::TimerThreadProc);
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::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);

View 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;