# HG changeset patch # User tron # Date 2005-08-05 08:24:12 # Node ID 31a28d276844d5093e09fa9ab4d39753515905e5 # Parent d508d68ef0ade5331e3efc1e4d8f72d38d605157 (svn r2807) Fix two major bugs in the threaded save code: - Do not dereference a local variable which no longer exists; this lead to random crashes when saving - (Win32) Do not close a handle before it is used last There are still many major problems (race conditions and resulting memory corruption/crashes) left diff --git a/functions.h b/functions.h --- a/functions.h +++ b/functions.h @@ -279,6 +279,5 @@ void DeterminePaths(void); void bubblesort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *)); bool CreateOTTDThread(void *func, void *param); -void CloseOTTDThread(void); void JoinOTTDThread(void); #endif /* FUNCTIONS_H */ diff --git a/os2.c b/os2.c --- a/os2.c +++ b/os2.c @@ -647,12 +647,6 @@ bool CreateOTTDThread(void *func, void * return(true); } -void CloseOTTDThread(void) -{ - _endthread(); - return; -} - void JoinOTTDThread(void) { if (thread1 == 0) diff --git a/saveload.c b/saveload.c --- a/saveload.c +++ b/saveload.c @@ -1292,7 +1292,6 @@ static bool SaveFileToDisk(void *ptr) fclose(_sl.fh); SaveFileDone(); - if (*(bool*)ptr) CloseOTTDThread(); return true; } @@ -1364,7 +1363,6 @@ SaveOrLoadResult SaveOrLoad(const char * /* General tactic is to first save the game to memory, then use an available writer * to write it to file, either in threaded mode if possible, or single-threaded */ if (mode == SL_SAVE) { /* SAVE game */ - bool threaded = true; fmt = GetSavegameFormat("memory"); // write to memory _sl.write_bytes = fmt->writer; @@ -1381,10 +1379,9 @@ SaveOrLoadResult SaveOrLoad(const char * SlWriteFill(); // flush the save buffer /* Write to file */ - if (_network_server || !CreateOTTDThread(&SaveFileToDisk, &threaded)) { + if (_network_server || !CreateOTTDThread(&SaveFileToDisk, NULL)) { DEBUG(misc, 1) ("cannot create savegame thread, reverting to single-threaded mode..."); - threaded = false; - SaveFileToDisk(&threaded); + SaveFileToDisk(NULL); } } else { /* LOAD game */ diff --git a/unix.c b/unix.c --- a/unix.c +++ b/unix.c @@ -530,8 +530,6 @@ bool CreateOTTDThread(void *func, void * return pthread_create(&thread1, NULL, func, param) == 0; } -void CloseOTTDThread(void) {return;} - void JoinOTTDThread(void) { if (thread1 == 0) return; diff --git a/win32.c b/win32.c --- a/win32.c +++ b/win32.c @@ -1204,16 +1204,12 @@ bool CreateOTTDThread(void *func, void * return hThread != NULL; } -void CloseOTTDThread(void) -{ - if (!CloseHandle(hThread)) DEBUG(misc, 0) ("Failed to close thread?..."); -} - void JoinOTTDThread(void) { if (hThread == NULL) return; WaitForSingleObject(hThread, INFINITE); + if (!CloseHandle(hThread)) DEBUG(misc, 0) ("Failed to close thread handle!"); }