Changeset - r2283:31a28d276844
[Not reviewed]
master
0 5 0
tron - 19 years ago 2005-08-05 08:24:12
tron@openttd.org
(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
5 files changed with 3 insertions and 19 deletions:
0 comments (0 inline, 0 general)
functions.h
Show inline comments
 
@@ -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 */
os2.c
Show inline comments
 
@@ -647,12 +647,6 @@ bool CreateOTTDThread(void *func, void *
 
	return(true);
 
}
 

	
 
void CloseOTTDThread(void)
 
{
 
	_endthread();
 
	return;
 
}
 

	
 
void JoinOTTDThread(void)
 
{
 
	if (thread1 == 0)
saveload.c
Show inline comments
 
@@ -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 */
unix.c
Show inline comments
 
@@ -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;
win32.c
Show inline comments
 
@@ -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!");
 
}
 

	
 

	
0 comments (0 inline, 0 general)