From bf7da9b3a889a699cb086879176a497058477992 Mon Sep 17 00:00:00 2001 From: rubidium Date: Sat, 4 Dec 2010 09:54:38 +0000 Subject: (svn r21379) -Codechange: move the actual save code into a separate function --- src/saveload/saveload.cpp | 52 ++++++++++++++++++++++++++++++----------------- 1 file changed, 33 insertions(+), 19 deletions(-) diff --git a/src/saveload/saveload.cpp b/src/saveload/saveload.cpp index 49ecba4b4..0425e2671 100644 --- a/src/saveload/saveload.cpp +++ b/src/saveload/saveload.cpp @@ -2470,6 +2470,38 @@ void WaitTillSaved() _save_thread = NULL; } +/** + * Actually perform the saving of the savegame. + * General tactic is to first save the game to memory, then write it to file + * using the writer, either in threaded mode if possible, or single-threaded. + * @param writer The filter to write the savegame to. + * @param threaded Whether to try to perform the saving asynchroniously. + */ +static SaveOrLoadResult DoSave(SaveFilter *writer, bool threaded) +{ + assert(!_ts.saveinprogress); + + _sl.dumper = new MemoryDumper(); + _sl.sf = writer; + + _sl_version = SAVEGAME_VERSION; + + SaveViewportBeforeSaveGame(); + SlSaveChunks(); + + SaveFileStart(); + if (!threaded || !ThreadObject::New(&SaveFileToDiskThread, NULL, &_save_thread)) { + if (threaded) DEBUG(sl, 1, "Cannot create savegame thread, reverting to single-threaded mode..."); + + SaveOrLoadResult result = SaveFileToDisk(false); + SaveFileDone(); + + return result; + } + + return SL_OK; +} + /** * Main Save or Load function where the high-level saveload functions are * handled. It opens the savegame, selects format and checks versions @@ -2539,29 +2571,11 @@ SaveOrLoadResult SaveOrLoad(const char *filename, int mode, Subdirectory sb, boo SlError(mode == SL_SAVE ? STR_GAME_SAVELOAD_ERROR_FILE_NOT_WRITEABLE : STR_GAME_SAVELOAD_ERROR_FILE_NOT_READABLE); } - /* 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 DEBUG(desync, 1, "save: %08x; %02x; %s", _date, _date_fract, filename); - - _sl.dumper = new MemoryDumper(); - _sl.sf = new FileWriter(fh); - - _sl_version = SAVEGAME_VERSION; - - SaveViewportBeforeSaveGame(); - SlSaveChunks(); - - SaveFileStart(); if (_network_server || !_settings_client.gui.threaded_saves) threaded = false; - if (!threaded || !ThreadObject::New(&SaveFileToDiskThread, NULL, &_save_thread)) { - if (threaded) DEBUG(sl, 1, "Cannot create savegame thread, reverting to single-threaded mode..."); - SaveOrLoadResult result = SaveFileToDisk(false); - SaveFileDone(); - - return result; - } + return DoSave(new FileWriter(fh), threaded); } else { // LOAD game assert(mode == SL_LOAD || mode == SL_LOAD_CHECK); DEBUG(desync, 1, "load: %s", filename); -- cgit v1.2.3-54-g00ecf