diff options
| author | Dan Engelbrecht <[email protected]> | 2022-03-30 13:30:29 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2022-03-30 13:30:29 +0200 |
| commit | f2d9aa0dbcaf893ad05bba2db793a1783fcc67ca (patch) | |
| tree | 1fa5c255a237549242b64bf2608539bf618f5552 | |
| parent | Merge pull request #67 from EpicGames/de/cache-lock-fixes (diff) | |
| parent | Make sure we wait for gc thread to complete before exiting (diff) | |
| download | zen-f2d9aa0dbcaf893ad05bba2db793a1783fcc67ca.tar.xz zen-f2d9aa0dbcaf893ad05bba2db793a1783fcc67ca.zip | |
Merge pull request #66 from EpicGames/de/gracefully-exit-gc
Make sure we wait for gc thread to complete before exiting
| -rw-r--r-- | zenserver/zenserver.cpp | 6 | ||||
| -rw-r--r-- | zenstore/gc.cpp | 24 |
2 files changed, 20 insertions, 10 deletions
diff --git a/zenserver/zenserver.cpp b/zenserver/zenserver.cpp index 3694a3e66..667bcd317 100644 --- a/zenserver/zenserver.cpp +++ b/zenserver/zenserver.cpp @@ -455,7 +455,11 @@ public: m_Http->RequestExit(); } - void Cleanup() { ZEN_INFO(ZEN_APP_NAME " cleaning up"); } + void Cleanup() + { + ZEN_INFO(ZEN_APP_NAME " cleaning up"); + m_GcScheduler.Shutdown(); + } void SetDedicatedMode(bool State) { m_IsDedicatedMode = State; } void SetTestMode(bool State) { m_TestMode = State; } 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<uint32_t>(GcSchedulerStatus::kIdle) == m_Status) { - m_TriggerParams = Params; - m_Status = static_cast<uint32_t>(GcSchedulerStatus::kRunning); - m_GcSignal.notify_one(); - return true; + m_TriggerParams = Params; + uint32_t IdleState = static_cast<uint32_t>(GcSchedulerStatus::kIdle); + if (m_Status.compare_exchange_strong(IdleState, static_cast<uint32_t>(GcSchedulerStatus::kRunning))) + { + m_GcSignal.notify_one(); + return true; + } } } @@ -486,12 +489,14 @@ GcScheduler::SchedulerThread() continue; } - WaitTime = m_Config.MonitorInterval; - m_Status = static_cast<uint32_t>(GcSchedulerStatus::kRunning); + WaitTime = m_Config.MonitorInterval; + uint32_t IdleState = static_cast<uint32_t>(GcSchedulerStatus::kIdle); + if (!m_Status.compare_exchange_strong(IdleState, static_cast<uint32_t>(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<uint32_t>(GcSchedulerStatus::kIdle); + uint32_t RunningState = static_cast<uint32_t>(GcSchedulerStatus::kRunning); + m_Status.compare_exchange_strong(RunningState, static_cast<uint32_t>(GcSchedulerStatus::kIdle)); } } |