From e43d0507301689d6178d310c98b1403588eb474f Mon Sep 17 00:00:00 2001 From: rubidium Date: Sun, 8 Jun 2008 15:27:57 +0000 Subject: (svn r13417) -Fix (r12945, r13413): freeing the ThreadObjects in a manner that hopefully doesn't cause crashes. --- src/saveload.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'src/saveload.cpp') diff --git a/src/saveload.cpp b/src/saveload.cpp index 585070cd1..dd0824582 100644 --- a/src/saveload.cpp +++ b/src/saveload.cpp @@ -95,6 +95,7 @@ static void NORETURN SlError(StringID string, const char *extra_msg = NULL) typedef void (*AsyncSaveFinishProc)(); static AsyncSaveFinishProc _async_save_finish = NULL; +static ThreadObject *_save_thread; /** * Called by save thread to tell we finished saving. @@ -117,6 +118,12 @@ void ProcessAsyncSaveFinish() _async_save_finish(); _async_save_finish = NULL; + + if (_save_thread != NULL) { + _save_thread->Join(); + delete _save_thread; + _save_thread = NULL; + } } /** @@ -1545,8 +1552,6 @@ static void SaveFileError() SaveFileDone(); } -static ThreadObject *_save_thread; - /** We have written the whole game into memory, _Savegame_pool, now find * and appropiate compressor and start writing to file. */ @@ -1617,6 +1622,7 @@ void WaitTillSaved() if (_save_thread == NULL) return; _save_thread->Join(); + delete _save_thread; _save_thread = NULL; } @@ -1695,7 +1701,7 @@ SaveOrLoadResult SaveOrLoad(const char *filename, int mode, Subdirectory sb) SaveFileStart(); if (_network_server || - (_save_thread = ThreadObject::New(&SaveFileToDiskThread, NULL, &ThreadObject::TerminateCleanup)) == NULL) { + (_save_thread = ThreadObject::New(&SaveFileToDiskThread, NULL)) == NULL) { if (!_network_server) DEBUG(sl, 1, "Cannot create savegame thread, reverting to single-threaded mode..."); SaveOrLoadResult result = SaveFileToDisk(false); -- cgit v1.2.3-54-g00ecf