diff --git a/openttd.dsp b/openttd.dsp index 127d362c02..01cd3731ad 100644 --- a/openttd.dsp +++ b/openttd.dsp @@ -402,6 +402,10 @@ SOURCE=.\texteff.c # End Source File # Begin Source File +SOURCE=.\thread.c +# End Source File +# Begin Source File + SOURCE=.\tile.c # End Source File # Begin Source File @@ -650,6 +654,10 @@ SOURCE=.\strings.h # End Source File # Begin Source File +SOURCE=.\thread.h +# End Source File +# Begin Source File + SOURCE=.\tile.h # End Source File # Begin Source File diff --git a/openttd.vcproj b/openttd.vcproj index 9970542885..ec8279e2eb 100644 --- a/openttd.vcproj +++ b/openttd.vcproj @@ -401,6 +401,9 @@ + + @@ -612,6 +615,9 @@ + + diff --git a/saveload.c b/saveload.c index 0c33d8c83d..a4ef8c80d8 100644 --- a/saveload.c +++ b/saveload.c @@ -1235,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 void SaveFileToDisk(void* arg) +static void* SaveFileToDisk(void* arg) { const SaveLoadFormat *fmt = GetSavegameFormat(_savegame_format); /* XXX - backup _sl.buf cause it is used internally by the writer @@ -1258,7 +1258,7 @@ static void SaveFileToDisk(void* arg) ShowErrorMessage(STR_4007_GAME_SAVE_FAILED, STR_NULL, 0, 0); SaveFileDone(); - return; + return NULL; } /* We have written our stuff to memory, now write it to file! */ @@ -1293,6 +1293,7 @@ static void SaveFileToDisk(void* arg) fclose(_sl.fh); SaveFileDone(); + return NULL; } diff --git a/thread.c b/thread.c index 6c70ebdb20..3258830d65 100644 --- a/thread.c +++ b/thread.c @@ -6,7 +6,7 @@ #if defined(__AMIGA__) || defined(__MORPHOS__) Thread* OTTDCreateThread(ThreadFunc function, void* arg) { return NULL; } -void OTTDJoinThread(Thread*) {} +void* OTTDJoinThread(Thread*) { return NULL; } #elif defined(__OS2__) @@ -17,15 +17,26 @@ void OTTDJoinThread(Thread*) {} struct Thread { TID thread; + ThradFunc func; + void* arg; + void* ret; }; +static void Proxy(void* arg) +{ + Thread* t = arg; + t->ret = t->func(t->arg); +} + Thread* OTTDCreateThread(ThreadFunc function, void* arg) { Thread* t = malloc(sizeof(*t)); if (t == NULL) return NULL; - t->thread = _beginthread(function, NULL, 32768, arg); + t->func = function; + t->arg = arg; + t->thread = _beginthread(Proxy, NULL, 32768, t); if (t->thread != -1) { return t; } else { @@ -34,12 +45,16 @@ Thread* OTTDCreateThread(ThreadFunc function, void* arg) } } -void OTTDJoinThread(Thread* t) +void* OTTDJoinThread(Thread* t) { - if (t == NULL) return; + void* ret; + + if (t == NULL) return NULL; DosWaitThread(&t->thread, DCWW_WAIT); + ret = t->ret; free(t); + return ret; } @@ -57,7 +72,7 @@ Thread* OTTDCreateThread(ThreadFunc function, void* arg) if (t == NULL) return NULL; - if (pthread_create(&t->thread, NULL, (void* (*)(void*))function, arg) == 0) { + if (pthread_create(&t->thread, NULL, function, arg) == 0) { return t; } else { free(t); @@ -65,12 +80,15 @@ Thread* OTTDCreateThread(ThreadFunc function, void* arg) } } -void OTTDJoinThread(Thread* t) +void* OTTDJoinThread(Thread* t) { - if (t == NULL) return; + void* ret; - pthread_join(t->thread, NULL); + if (t == NULL) return NULL; + + pthread_join(t->thread, &ret); free(t); + return ret; } @@ -80,8 +98,18 @@ void OTTDJoinThread(Thread* t) struct Thread { HANDLE thread; + ThradFunc func; + void* arg; + void* ret; }; +static DWORD WINAPI Proxy(LPVOID arg) +{ + Thread* t = arg; + t->ret = t->func(t->arg); + return 0; +} + Thread* OTTDCreateThread(ThreadFunc function, void* arg) { Thread* t = malloc(sizeof(*t)); @@ -89,9 +117,9 @@ Thread* OTTDCreateThread(ThreadFunc function, void* arg) if (t == NULL) return NULL; - t->thread = CreateThread( - NULL, 0, (LPTHREAD_START_ROUTINE)function, arg, 0, &dwThreadId - ); + t->func = function; + t->arg = arg; + t->thread = CreateThread(NULL, 0, Proxy, arg, 0, &dwThreadId); if (t->thread != NULL) { return t; @@ -101,12 +129,16 @@ Thread* OTTDCreateThread(ThreadFunc function, void* arg) } } -void OTTDJoinThread(Thread* t) +void* OTTDJoinThread(Thread* t) { - if (t == NULL) return; + void* ret; + + if (t == NULL) return NULL; WaitForSingleObject(t->thread, INFINITE); CloseHandle(t->thread); + ret = t->ret; free(t); + return ret; } #endif diff --git a/thread.h b/thread.h index 1f4878106f..73cea8c57a 100644 --- a/thread.h +++ b/thread.h @@ -11,9 +11,9 @@ typedef struct Thread Thread; -typedef void (*ThreadFunc)(void*); +typedef void* (*ThreadFunc)(void*); Thread* OTTDCreateThread(ThreadFunc, void*); -void OTTDJoinThread(Thread*); +void* OTTDJoinThread(Thread*); #endif