mirror of https://github.com/OpenTTD/OpenTTD.git
(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.
This commit is contained in:
parent
e159ada7a2
commit
a06d5548eb
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue