summaryrefslogtreecommitdiff
path: root/src/saveload.cpp
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2008-04-19 10:18:38 +0000
committerrubidium <rubidium@openttd.org>2008-04-19 10:18:38 +0000
commit0670ec6ee1489077e36f6a9af04af7c3f5f15de8 (patch)
tree4be252134284abf1ac2d62c17a3d71b160a34a2d /src/saveload.cpp
parent1b867382d6f6ff13dd0a61c2417b1b06a8e31022 (diff)
downloadopenttd-0670ec6ee1489077e36f6a9af04af7c3f5f15de8.tar.xz
(svn r12784) -Codechange: handle the asynchronious save 'handlers' in saveload.cpp instead of openttd.cpp.
Diffstat (limited to 'src/saveload.cpp')
-rw-r--r--src/saveload.cpp36
1 files changed, 31 insertions, 5 deletions
diff --git a/src/saveload.cpp b/src/saveload.cpp
index 61d0ed29b..85e9a7ae4 100644
--- a/src/saveload.cpp
+++ b/src/saveload.cpp
@@ -87,6 +87,32 @@ static void NORETURN SlError(StringID string, const char *extra_msg = NULL)
throw std::exception();
}
+typedef void (*AsyncSaveFinishProc)();
+static AsyncSaveFinishProc _async_save_finish = NULL;
+
+/**
+ * Called by save thread to tell we finished saving.
+ */
+static void SetAsyncSaveFinish(AsyncSaveFinishProc proc)
+{
+ if (_exit_game) return;
+ while (_async_save_finish != NULL) CSleep(10);
+
+ _async_save_finish = proc;
+}
+
+/**
+ * Handle async save finishes.
+ */
+void ProcessAsyncSaveFinish()
+{
+ if (_async_save_finish == NULL) return;
+
+ _async_save_finish();
+
+ _async_save_finish = NULL;
+}
+
/**
* Fill the input buffer by reading from the file with the given reader
*/
@@ -1457,7 +1483,7 @@ static inline SaveOrLoadResult AbortSaveLoad()
/** Update the gui accordingly when starting saving
* and set locks on saveload. Also turn off fast-forward cause with that
* saving takes Aaaaages */
-void SaveFileStart()
+static void SaveFileStart()
{
_ts.ff_state = _fast_forward;
_fast_forward = 0;
@@ -1469,7 +1495,7 @@ void SaveFileStart()
/** Update the gui accordingly when saving is done and release locks
* on saveload */
-void SaveFileDone()
+static void SaveFileDone()
{
_fast_forward = _ts.ff_state;
if (_cursor.sprite == SPR_CURSOR_ZZZ) SetMouseCursor(SPR_CURSOR_MOUSE, PAL_NONE);
@@ -1496,7 +1522,7 @@ const char *GetSaveLoadErrorString()
}
/** Show a gui message when saving has failed */
-void SaveFileError()
+static void SaveFileError()
{
SetDParamStr(0, GetSaveLoadErrorString());
ShowErrorMessage(STR_012D, STR_NULL, 0, 0);
@@ -1545,7 +1571,7 @@ static SaveOrLoadResult SaveFileToDisk(bool threaded)
GetSavegameFormat("memory")->uninit_write(); // clean the memorypool
fclose(_sl.fh);
- if (threaded) OTTD_SendThreadMessage(MSG_OTTD_SAVETHREAD_DONE);
+ if (threaded) SetAsyncSaveFinish(SaveFileDone);
return SL_OK;
}
@@ -1557,7 +1583,7 @@ static SaveOrLoadResult SaveFileToDisk(bool threaded)
fprintf(stderr, GetSaveLoadErrorString());
if (threaded) {
- OTTD_SendThreadMessage(MSG_OTTD_SAVETHREAD_ERROR);
+ SetAsyncSaveFinish(SaveFileError);
} else {
SaveFileError();
}