changeset 5705:033f61ef4134 draft

(svn r8171) -Fix (FS#556): return SL_ERROR when unthreaded saves failed, to make sure we do not try to send zero-byte savegames.
author rubidium <rubidium@openttd.org>
date Wed, 17 Jan 2007 00:01:55 +0000
parents b8856bcf218b
children f7eba7e82662
files src/network/network_server.cpp src/saveload.cpp
diffstat 2 files changed, 19 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/src/network/network_server.cpp
+++ b/src/network/network_server.cpp
@@ -289,6 +289,8 @@
 		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);
--- a/src/saveload.cpp
+++ b/src/saveload.cpp
@@ -1428,7 +1428,7 @@
 /** 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];
@@ -1440,12 +1440,12 @@
 		_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);
@@ -1478,7 +1478,14 @@
 	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;
 }
 
@@ -1567,12 +1574,14 @@
 
 		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);