From be2b1564a880bd8580e7a7809a972977db240ea2 Mon Sep 17 00:00:00 2001 From: leo60228 Date: Thu, 2 Sep 2021 13:19:51 -0400 Subject: [PATCH] Call FS.syncfs on Emscripten (#838) Also, add a sync parameter to avoid calling syncfs too often. Calling syncfs twice in a row is both inefficient and leads to errors displaying twice. This allows us to bypass it when saving unlock.vvv as part of savestatsandsettings. --- desktop_version/src/FileSystemUtils.cpp | 24 ++++++++++++++++++++++-- desktop_version/src/FileSystemUtils.h | 2 +- desktop_version/src/Game.cpp | 10 +++++----- desktop_version/src/Game.h | 4 ++-- 4 files changed, 30 insertions(+), 10 deletions(-) diff --git a/desktop_version/src/FileSystemUtils.cpp b/desktop_version/src/FileSystemUtils.cpp index fb5cf1d7..c8a847dd 100644 --- a/desktop_version/src/FileSystemUtils.cpp +++ b/desktop_version/src/FileSystemUtils.cpp @@ -26,7 +26,12 @@ int mkdir(char* path, int mode) MultiByteToWideChar(CP_UTF8, 0, path, -1, utf16_path, MAX_PATH); return CreateDirectoryW(utf16_path, NULL); } -#elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__HAIKU__) || defined(__DragonFly__) || defined(__EMSCRIPTEN__) || defined(__unix__) +#elif defined(__EMSCRIPTEN__) +#include +#include +#include +#define MAX_PATH PATH_MAX +#elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__HAIKU__) || defined(__DragonFly__) || defined(__unix__) #include #include #define MAX_PATH PATH_MAX @@ -857,7 +862,7 @@ fail: return true; } -bool FILESYSTEM_saveTiXml2Document(const char *name, tinyxml2::XMLDocument& doc) +bool FILESYSTEM_saveTiXml2Document(const char *name, tinyxml2::XMLDocument& doc, bool sync /*= true*/) { /* XMLDocument.SaveFile doesn't account for Unicode paths, PHYSFS does */ tinyxml2::XMLPrinter printer; @@ -869,6 +874,21 @@ bool FILESYSTEM_saveTiXml2Document(const char *name, tinyxml2::XMLDocument& doc) } PHYSFS_writeBytes(handle, printer.CStr(), printer.CStrSize() - 1); // subtract one because CStrSize includes terminating null PHYSFS_close(handle); + +#ifdef __EMSCRIPTEN__ + if (sync) + { + EM_ASM(FS.syncfs(false, function(err) + { + if (err) + { + console.warn("Error saving:", err); + alert("Error saving. Check console for more information."); + } + })); + } +#endif + return true; } diff --git a/desktop_version/src/FileSystemUtils.h b/desktop_version/src/FileSystemUtils.h index 60b1309e..40552726 100644 --- a/desktop_version/src/FileSystemUtils.h +++ b/desktop_version/src/FileSystemUtils.h @@ -35,7 +35,7 @@ void FILESYSTEM_freeMemory(unsigned char **mem); bool FILESYSTEM_loadBinaryBlob(binaryBlob* blob, const char* filename); -bool FILESYSTEM_saveTiXml2Document(const char *name, tinyxml2::XMLDocument& doc); +bool FILESYSTEM_saveTiXml2Document(const char *name, tinyxml2::XMLDocument& doc, bool sync = true); bool FILESYSTEM_loadTiXml2Document(const char *name, tinyxml2::XMLDocument& doc); void FILESYSTEM_enumerateLevelDirFileNames(void (*callback)(const char* filename)); diff --git a/desktop_version/src/Game.cpp b/desktop_version/src/Game.cpp index e19ec730..4d8dc244 100644 --- a/desktop_version/src/Game.cpp +++ b/desktop_version/src/Game.cpp @@ -4312,7 +4312,7 @@ void Game::deserializesettings(tinyxml2::XMLElement* dataNode, ScreenSettings* s } } -bool Game::savestats(void) +bool Game::savestats(bool sync /*= true*/) { if (graphics.screenbuffer == NULL) { @@ -4322,10 +4322,10 @@ bool Game::savestats(void) ScreenSettings screen_settings; graphics.screenbuffer->GetSettings(&screen_settings); - return savestats(&screen_settings); + return savestats(&screen_settings, sync); } -bool Game::savestats(const ScreenSettings* screen_settings) +bool Game::savestats(const ScreenSettings* screen_settings, bool sync /*= true*/) { tinyxml2::XMLDocument doc; bool already_exists = FILESYSTEM_loadTiXml2Document("saves/unlock.vvv", doc); @@ -4406,12 +4406,12 @@ bool Game::savestats(const ScreenSettings* screen_settings) serializesettings(dataNode, screen_settings); - return FILESYSTEM_saveTiXml2Document("saves/unlock.vvv", doc); + return FILESYSTEM_saveTiXml2Document("saves/unlock.vvv", doc, sync); } bool Game::savestatsandsettings(void) { - const bool stats_saved = savestats(); + const bool stats_saved = savestats(false); const bool settings_saved = savesettings(); diff --git a/desktop_version/src/Game.h b/desktop_version/src/Game.h index 5798d592..7baa1c53 100644 --- a/desktop_version/src/Game.h +++ b/desktop_version/src/Game.h @@ -156,8 +156,8 @@ public: void loadstats(ScreenSettings* screen_settings); - bool savestats(const ScreenSettings* screen_settings); - bool savestats(void); + bool savestats(const ScreenSettings* screen_settings, bool sync = true); + bool savestats(bool sync = true); void deletestats(void);