mirror of
https://github.com/JGRennison/OpenTTD-patches.git
synced 2024-11-17 21:25:40 +00:00
(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
This commit is contained in:
parent
062472161a
commit
484fae74a2
@ -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 */
|
||||
|
6
os2.c
6
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)
|
||||
|
@ -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 */
|
||||
|
2
unix.c
2
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;
|
||||
|
6
win32.c
6
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!");
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user