summaryrefslogtreecommitdiff
path: root/saveload.c
diff options
context:
space:
mode:
Diffstat (limited to 'saveload.c')
-rw-r--r--saveload.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/saveload.c b/saveload.c
index e036ae748..0c33d8c83 100644
--- a/saveload.c
+++ b/saveload.c
@@ -21,6 +21,7 @@
#include "functions.h"
#include "vehicle.h"
#include "station.h"
+#include "thread.h"
#include "town.h"
#include "player.h"
#include "saveload.h"
@@ -1234,7 +1235,7 @@ static inline void SaveFileDone(void)
/** We have written the whole game into memory, _save_pool, now find
* and appropiate compressor and start writing to file.
*/
-static bool SaveFileToDisk(void *ptr)
+static void SaveFileToDisk(void* arg)
{
const SaveLoadFormat *fmt = GetSavegameFormat(_savegame_format);
/* XXX - backup _sl.buf cause it is used internally by the writer
@@ -1257,7 +1258,7 @@ static bool SaveFileToDisk(void *ptr)
ShowErrorMessage(STR_4007_GAME_SAVE_FAILED, STR_NULL, 0, 0);
SaveFileDone();
- return false;
+ return;
}
/* We have written our stuff to memory, now write it to file! */
@@ -1292,9 +1293,18 @@ static bool SaveFileToDisk(void *ptr)
fclose(_sl.fh);
SaveFileDone();
- return true;
}
+
+static Thread* save_thread;
+
+void WaitTillSaved(void)
+{
+ OTTDJoinThread(save_thread);
+ save_thread = NULL;
+}
+
+
/**
* Main Save or Load function where the high-level saveload functions are
* handled. It opens the savegame, selects format and checks versions
@@ -1311,7 +1321,7 @@ SaveOrLoadResult SaveOrLoad(const char *filename, int mode)
/* An instance of saving is already active, so wait until it is done */
if (_ts.saveinprogress) {
if (!_do_autosave) ShowErrorMessage(_error_message, STR_SAVE_STILL_IN_PROGRESS, 0, 0);
- JoinOTTDThread(); // synchronize and wait until save is finished to continue
+ WaitTillSaved();
// nonsense to do an autosave while we were still saving our game, so skip it
if (_do_autosave) return SL_OK;
}
@@ -1379,7 +1389,8 @@ SaveOrLoadResult SaveOrLoad(const char *filename, int mode)
SlWriteFill(); // flush the save buffer
/* Write to file */
- if (_network_server || !CreateOTTDThread(&SaveFileToDisk, NULL)) {
+ if (_network_server ||
+ (save_thread = OTTDCreateThread(&SaveFileToDisk, NULL)) == NULL) {
DEBUG(misc, 1) ("cannot create savegame thread, reverting to single-threaded mode...");
SaveFileToDisk(NULL);
}