From d345508195e2e3ede3af040ca82699e7e6d7a977 Mon Sep 17 00:00:00 2001 From: WerWolv Date: Sat, 31 Jul 2021 17:11:10 +0200 Subject: [PATCH] fix: ImHex should crash less often now when exiting --- .gitignore | 1 + .../include/hex/helpers/shared_data.hpp | 4 ++ .../libimhex/source/api/content_registry.cpp | 5 +++ plugins/libimhex/source/api/event.cpp | 2 +- source/init/tasks.cpp | 38 ++++++++++++++++++- 5 files changed, 47 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index aff1588fa..6e6e38edc 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ cmake-build-debug/ cmake-build-release/ cmake-build-relwithdebinfo/ +cmake-build-wsl/ build-linux/ build/ diff --git a/plugins/libimhex/include/hex/helpers/shared_data.hpp b/plugins/libimhex/include/hex/helpers/shared_data.hpp index cd4cc03d9..8559794a2 100644 --- a/plugins/libimhex/include/hex/helpers/shared_data.hpp +++ b/plugins/libimhex/include/hex/helpers/shared_data.hpp @@ -47,6 +47,10 @@ namespace hex { SharedData::sharedVariables[variableName] = value; } + static void clearVariables() { + SharedData::sharedVariables.clear(); + } + public: static std::vector> deferredCalls; static prv::Provider *currentProvider; diff --git a/plugins/libimhex/source/api/content_registry.cpp b/plugins/libimhex/source/api/content_registry.cpp index 8297565a8..193a04068 100644 --- a/plugins/libimhex/source/api/content_registry.cpp +++ b/plugins/libimhex/source/api/content_registry.cpp @@ -10,14 +10,19 @@ namespace hex { /* Settings */ void ContentRegistry::Settings::load() { + bool loaded = false; for (const auto &dir : hex::getPath(ImHexPath::Config)) { std::ifstream settingsFile(dir + "/settings.json"); if (settingsFile.good()) { settingsFile >> getSettingsData(); + loaded = true; break; } } + + if (!loaded) + ContentRegistry::Settings::store(); } void ContentRegistry::Settings::store() { diff --git a/plugins/libimhex/source/api/event.cpp b/plugins/libimhex/source/api/event.cpp index a88a26902..326a1f395 100644 --- a/plugins/libimhex/source/api/event.cpp +++ b/plugins/libimhex/source/api/event.cpp @@ -2,7 +2,7 @@ namespace hex { - std::map EventManager::s_tokenStore; EventManager::EventList EventManager::s_events; + std::map EventManager::s_tokenStore; } \ No newline at end of file diff --git a/source/init/tasks.cpp b/source/init/tasks.cpp index 89cfd8681..5c2f1a15e 100644 --- a/source/init/tasks.cpp +++ b/source/init/tasks.cpp @@ -98,11 +98,45 @@ namespace hex::init { return true; } - bool deleteViews() { + bool deleteSharedData() { + SharedData::deferredCalls.clear(); + + delete SharedData::currentProvider; + SharedData::currentProvider = nullptr; + + SharedData::settingsEntries.clear(); + SharedData::settingsJson.clear(); + + SharedData::commandPaletteCommands.clear(); + SharedData::patternLanguageFunctions.clear(); + for (auto &view : SharedData::views) delete view; SharedData::views.clear(); + SharedData::toolsEntries.clear(); + + SharedData::dataInspectorEntries.clear(); + + SharedData::bookmarkEntries.clear(); + + for (auto &pattern : SharedData::patternData) + delete pattern; + SharedData::patternData.clear(); + + SharedData::languageNames.clear(); + SharedData::languageDefinitions.clear(); + SharedData::loadedLanguageStrings.clear(); + + SharedData::welcomeScreenEntries.clear(); + SharedData::footerItems.clear(); + + SharedData::dataProcessorNodes.clear(); + + SharedData::recentFilePaths.clear(); + + SharedData::clearVariables(); + return true; } @@ -160,8 +194,8 @@ namespace hex::init { std::vector getExitTasks() { return { - { "Cleaning up views...", deleteViews }, { "Saving settings...", storeSettings }, + { "Cleaning up shared data...", deleteSharedData }, { "Unloading plugins...", unloadPlugins }, }; }