From 77da7239570057a7ad4338c3fc0675b92084cb08 Mon Sep 17 00:00:00 2001 From: Dan Engelbrecht Date: Wed, 30 Mar 2022 10:39:11 +0200 Subject: Make sure we wait for gc thread to complete before exiting --- zenstore/gc.cpp | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) (limited to 'zenstore/gc.cpp') diff --git a/zenstore/gc.cpp b/zenstore/gc.cpp index 7be93b4af..0f7a11789 100644 --- a/zenstore/gc.cpp +++ b/zenstore/gc.cpp @@ -419,10 +419,13 @@ GcScheduler::Trigger(const GcScheduler::TriggerParams& Params) std::unique_lock Lock(m_GcMutex); if (static_cast(GcSchedulerStatus::kIdle) == m_Status) { - m_TriggerParams = Params; - m_Status = static_cast(GcSchedulerStatus::kRunning); - m_GcSignal.notify_one(); - return true; + m_TriggerParams = Params; + uint32_t IdleState = static_cast(GcSchedulerStatus::kIdle); + if (m_Status.compare_exchange_strong(IdleState, static_cast(GcSchedulerStatus::kRunning))) + { + m_GcSignal.notify_one(); + return true; + } } } @@ -486,12 +489,14 @@ GcScheduler::SchedulerThread() continue; } - WaitTime = m_Config.MonitorInterval; - m_Status = static_cast(GcSchedulerStatus::kRunning); + WaitTime = m_Config.MonitorInterval; + uint32_t IdleState = static_cast(GcSchedulerStatus::kIdle); + if (!m_Status.compare_exchange_strong(IdleState, static_cast(GcSchedulerStatus::kRunning))) + { + continue; + } } - ZEN_ASSERT(Status() == GcSchedulerStatus::kRunning); - GcContext GcCtx; GcCtx.SetDeletionMode(true); GcCtx.CollectSmallObjects(m_Config.CollectSmallObjects); @@ -531,7 +536,8 @@ GcScheduler::SchedulerThread() ZEN_INFO("garbage collection DONE after {}", NiceTimeSpanMs(Timer.GetElapsedTimeMs())); - m_Status = static_cast(GcSchedulerStatus::kIdle); + uint32_t RunningState = static_cast(GcSchedulerStatus::kRunning); + m_Status.compare_exchange_strong(RunningState, static_cast(GcSchedulerStatus::kIdle)); } } -- cgit v1.2.3