summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortruelight <truelight@openttd.org>2006-08-20 13:39:33 +0000
committertruelight <truelight@openttd.org>2006-08-20 13:39:33 +0000
commita06d5548ebe58ab290be50ca4b31368db5f4bc10 (patch)
tree2f784ed7fc2f9f935ddaf767abefd0e0aa5a4099
parente159ada7a2a0367c99e94ee07b1d439e7ffacc0b (diff)
downloadopenttd-a06d5548ebe58ab290be50ca4b31368db5f4bc10.tar.xz
(svn r5977) -Fix [FS#78]: never set I-am-a-thread bool to true IN the thread. Machines with
dualcore can be faster then you want, and therefor create 2 threads, while you made the bool to make sure there is never more then 1 thread of this type.
-rw-r--r--openttd.c7
-rw-r--r--openttd.h6
-rw-r--r--saveload.c4
3 files changed, 8 insertions, 9 deletions
diff --git a/openttd.c b/openttd.c
index ed425de9d..708bfc317 100644
--- a/openttd.c
+++ b/openttd.c
@@ -535,9 +535,9 @@ int ttd_main(int argc, char *argv[])
/** Mutex so that only one thread can communicate with the main program
* at any given time */
-static ThreadMsg _message = 0;
+static ThreadMsg _message = MSG_OTTD_NO_MESSAGE;
-static inline void OTTD_ReleaseMutex(void) {_message = 0;}
+static inline void OTTD_ReleaseMutex(void) {_message = MSG_OTTD_NO_MESSAGE;}
static inline ThreadMsg OTTD_PollThreadEvent(void) {return _message;}
/** Called by running thread to execute some action in the main game.
@@ -545,7 +545,7 @@ static inline ThreadMsg OTTD_PollThreadEvent(void) {return _message;}
void OTTD_SendThreadMessage(ThreadMsg msg)
{
if (_exit_game) return;
- while (_message != 0) CSleep(10);
+ while (_message != MSG_OTTD_NO_MESSAGE) CSleep(10);
_message = msg;
}
@@ -557,7 +557,6 @@ void OTTD_SendThreadMessage(ThreadMsg msg)
static void ProcessSentMessage(ThreadMsg message)
{
switch (message) {
- case MSG_OTTD_SAVETHREAD_START: SaveFileStart(); break;
case MSG_OTTD_SAVETHREAD_DONE: SaveFileDone(); break;
case MSG_OTTD_SAVETHREAD_ERROR: SaveFileError(); break;
default: NOT_REACHED();
diff --git a/openttd.h b/openttd.h
index 4c412cb53..a7b2abd91 100644
--- a/openttd.h
+++ b/openttd.h
@@ -527,9 +527,9 @@ VARDEF byte _no_scroll;
* the OTTD_SendThreadMessage() function. Actions to perform upon the message are handled
* in the ProcessSentMessage() function */
typedef enum ThreadMsgs {
- MSG_OTTD_SAVETHREAD_START = 1,
- MSG_OTTD_SAVETHREAD_DONE = 2,
- MSG_OTTD_SAVETHREAD_ERROR = 3,
+ MSG_OTTD_NO_MESSAGE,
+ MSG_OTTD_SAVETHREAD_DONE,
+ MSG_OTTD_SAVETHREAD_ERROR,
} ThreadMsg;
void OTTD_SendThreadMessage(ThreadMsg msg);
diff --git a/saveload.c b/saveload.c
index e02693ba8..7a9f7ba29 100644
--- a/saveload.c
+++ b/saveload.c
@@ -1402,8 +1402,6 @@ static void* SaveFileToDisk(void *arg)
const SaveLoadFormat *fmt;
uint32 hdr[2];
- if (arg != NULL) OTTD_SendThreadMessage(MSG_OTTD_SAVETHREAD_START);
-
/* XXX - Setup setjmp error handler if an error occurs anywhere deep during
* loading/saving execute a longjmp() and continue execution here */
if (setjmp(_sl.excpt)) {
@@ -1536,10 +1534,12 @@ SaveOrLoadResult SaveOrLoad(const char *filename, int mode)
SlSaveChunks();
SlWriteFill(); // flush the save buffer
+ SaveFileStart();
if (_network_server ||
(save_thread = OTTDCreateThread(&SaveFileToDisk, (void*)"")) == NULL) {
DEBUG(misc, 1) ("[Sl] Cannot create savegame thread, reverting to single-threaded mode...");
SaveFileToDisk(NULL);
+ SaveFileDone();
}
} else { /* LOAD game */