From a86e9689dfb969690dc1fcdcdde22506e5b4b94b Mon Sep 17 00:00:00 2001 From: tron Date: Fri, 5 Aug 2005 08:24:12 +0000 Subject: [PATCH] (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 --- functions.h | 1 - os2.c | 6 ------ saveload.c | 7 ++----- unix.c | 2 -- win32.c | 6 +----- 5 files changed, 3 insertions(+), 19 deletions(-) diff --git a/functions.h b/functions.h index 6948a44d85..8537e6e132 100644 --- 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 index 1e80393637..468c01c558 100644 --- a/os2.c +++ b/os2.c @@ -647,12 +647,6 @@ bool CreateOTTDThread(void *func, void *param) return(true); } -void CloseOTTDThread(void) -{ - _endthread(); - return; -} - void JoinOTTDThread(void) { if (thread1 == 0) diff --git a/saveload.c b/saveload.c index f16730434d..e036ae7485 100644 --- 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 *filename, int mode) /* 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 *filename, int mode) 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 index 469be3e9ed..cb13eb06d7 100644 --- a/unix.c +++ b/unix.c @@ -530,8 +530,6 @@ bool CreateOTTDThread(void *func, void *param) 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 index ffd1754c01..f4857a0757 100644 --- a/win32.c +++ b/win32.c @@ -1204,16 +1204,12 @@ bool CreateOTTDThread(void *func, void *param) 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!"); }