aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2022-03-30 13:30:29 +0200
committerGitHub <[email protected]>2022-03-30 13:30:29 +0200
commitf2d9aa0dbcaf893ad05bba2db793a1783fcc67ca (patch)
tree1fa5c255a237549242b64bf2608539bf618f5552
parentMerge pull request #67 from EpicGames/de/cache-lock-fixes (diff)
parentMake sure we wait for gc thread to complete before exiting (diff)
downloadzen-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.cpp6
-rw-r--r--zenstore/gc.cpp24
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));
}
}