@@ -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);
@@ -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);
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();
Status change: