Changeset - r5705:9e0dd407bd11
[Not reviewed]
master
0 2 0
rubidium - 17 years ago 2007-01-17 00:01:55
rubidium@openttd.org
(svn r8171) -Fix (FS#556): return SL_ERROR when unthreaded saves failed, to make sure we do not try to send zero-byte savegames.
2 files changed with 19 insertions and 8 deletions:
0 comments (0 inline, 0 general)
src/network/network_server.cpp
Show inline comments
 
@@ -286,12 +286,14 @@ DEF_SERVER_SEND_COMMAND(PACKET_SERVER_MA
 
		snprintf(filename, lengthof(filename), "%s%snetwork_server.tmp",  _paths.autosave_dir, PATHSEP);
 
		if (SaveOrLoad(filename, SL_SAVE) != SL_OK) error("network savedump failed");
 

	
 
		file_pointer = fopen(filename, "rb");
 
		fseek(file_pointer, 0, SEEK_END);
 

	
 
		if (ftell(file_pointer) == 0) error("network savedump failed - zero sized savegame?");
 

	
 
		// Now send the _frame_counter and how many packets are coming
 
		p = NetworkSend_Init(PACKET_SERVER_MAP);
 
		NetworkSend_uint8(p, MAP_PACKET_START);
 
		NetworkSend_uint32(p, _frame_counter);
 
		NetworkSend_uint32(p, ftell(file_pointer));
 
		NetworkSend_Packet(p, cs);
src/saveload.cpp
Show inline comments
 
@@ -1425,30 +1425,30 @@ void SaveFileError(void)
 

	
 
static OTTDThread* save_thread;
 

	
 
/** We have written the whole game into memory, _Savegame_pool, now find
 
 * and appropiate compressor and start writing to file.
 
 */
 
static void* SaveFileToDisk(void *arg)
 
static SaveOrLoadResult SaveFileToDisk(bool threaded)
 
{
 
	const SaveLoadFormat *fmt;
 
	uint32 hdr[2];
 

	
 
	/* XXX - Setup setjmp error handler if an error occurs anywhere deep during
 
	 * loading/saving execute a longjmp() and continue execution here */
 
	if (setjmp(_sl.excpt)) {
 
		AbortSaveLoad();
 
		_sl.excpt_uninit();
 

	
 
		fprintf(stderr, "Save game failed: %s.", _sl.excpt_msg);
 
		if (arg != NULL) {
 
		if (threaded) {
 
			OTTD_SendThreadMessage(MSG_OTTD_SAVETHREAD_ERROR);
 
		} else {
 
			SaveFileError();
 
		}
 
		return NULL;
 
		return SL_ERROR;
 
	}
 

	
 
	fmt = GetSavegameFormat(_savegame_format);
 

	
 
	/* We have written our stuff to memory, now write it to file! */
 
	hdr[0] = fmt->tag;
 
@@ -1475,13 +1475,20 @@ static void* SaveFileToDisk(void *arg)
 

	
 
	fmt->uninit_write();
 
	assert(_ts.count == _sl.offs_base);
 
	GetSavegameFormat("memory")->uninit_write(); // clean the memorypool
 
	fclose(_sl.fh);
 

	
 
	if (arg != NULL) OTTD_SendThreadMessage(MSG_OTTD_SAVETHREAD_DONE);
 
	if (threaded) OTTD_SendThreadMessage(MSG_OTTD_SAVETHREAD_DONE);
 

	
 
	return SL_OK;
 
}
 

	
 
static void* SaveFileToDiskThread(void *arg)
 
{
 
	SaveFileToDisk(true);
 
	return NULL;
 
}
 

	
 
void WaitTillSaved(void)
 
{
 
	OTTDJoinThread(save_thread);
 
@@ -1564,18 +1571,20 @@ SaveOrLoadResult SaveOrLoad(const char *
 
		BeforeSaveGame();
 
		SlSaveChunks();
 
		SlWriteFill(); // flush the save buffer
 

	
 
		SaveFileStart();
 
		if (_network_server ||
 
					(save_thread = OTTDCreateThread(&SaveFileToDisk, (void*)"")) == NULL) {
 
			DEBUG(sl, 1, "Cannot create savegame thread, reverting to single-threaded mode...");
 
			SaveFileToDisk(NULL);
 
					(save_thread = OTTDCreateThread(&SaveFileToDiskThread, NULL)) == NULL) {
 
			if (!_network_server) DEBUG(sl, 1, "Cannot create savegame thread, reverting to single-threaded mode...");
 

	
 
			SaveOrLoadResult result = SaveFileToDisk(false);
 
			SaveFileDone();
 

	
 
			return result;
 
		}
 

	
 
	} else { /* LOAD game */
 
		assert(mode == SL_LOAD);
 

	
 
		if (fread(hdr, sizeof(hdr), 1, _sl.fh) != 1) {
 
			DEBUG(sl, 0, "Cannot read savegame header, aborting");
 
			return AbortSaveLoad();
0 comments (0 inline, 0 general)