From 8de71fc9d6f2226e84074e941139ca0a8f1e6b0f Mon Sep 17 00:00:00 2001 From: Alexander Harkness Date: Mon, 21 Sep 2020 12:12:09 +0000 Subject: [PATCH] Synchronously save chunks on server shutdown (#4900) + Synchronously save chunks on server shutdown. Fixes #4884 --- src/Root.cpp | 12 ++++++++++++ src/Root.h | 3 +++ src/Server.cpp | 3 ++- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/Root.cpp b/src/Root.cpp index b90a229c9..b3712a687 100644 --- a/src/Root.cpp +++ b/src/Root.cpp @@ -577,6 +577,18 @@ void cRoot::SaveAllChunks(void) +void cRoot::SaveAllChunksNow(void) +{ + for (auto & Entry : m_WorldsByName) + { + Entry.second.SaveAllChunks(); + } +} + + + + + void cRoot::SetSavingEnabled(bool a_SavingEnabled) { for (auto & Entry : m_WorldsByName) diff --git a/src/Root.h b/src/Root.h index 1f5354c71..6ec8e5481 100644 --- a/src/Root.h +++ b/src/Root.h @@ -140,6 +140,9 @@ public: /** Saves all chunks in all worlds */ void SaveAllChunks(void); // tolua_export + /** Saves all chunks in all worlds synchronously (waits until dirty chunks have been sent to the ChunkStorage queue before returning) */ + void SaveAllChunksNow(void); + /** Sets whether saving chunks is enabled in all worlds (overrides however the worlds were already set) */ void SetSavingEnabled(bool a_SavingEnabled); // tolua_export diff --git a/src/Server.cpp b/src/Server.cpp index a1dedf333..67629ef2c 100644 --- a/src/Server.cpp +++ b/src/Server.cpp @@ -648,7 +648,8 @@ void cServer::Shutdown(void) // Notify the tick thread and wait for it to terminate: m_TickThread.Stop(); - cRoot::Get()->SaveAllChunks(); + // Save all chunks in all worlds, wait for chunks to be sent to the ChunkStorage queue for each world: + cRoot::Get()->SaveAllChunksNow(); // Remove all clients: cCSLock Lock(m_CSClients);