From 789d469477ef80c676c8103663889dd873e33d49 Mon Sep 17 00:00:00 2001 From: WerWolv Date: Wed, 5 Jun 2024 23:02:38 +0200 Subject: [PATCH] impr: Make providers close instantly --- lib/libimhex/source/api/imhex_api.cpp | 70 +++++++++++++++++---------- 1 file changed, 44 insertions(+), 26 deletions(-) diff --git a/lib/libimhex/source/api/imhex_api.cpp b/lib/libimhex/source/api/imhex_api.cpp index c012229bb..b3455ddcc 100644 --- a/lib/libimhex/source/api/imhex_api.cpp +++ b/lib/libimhex/source/api/imhex_api.cpp @@ -185,24 +185,24 @@ namespace hex { impl::s_hoveringFunctions->erase(id); } - static u32 tooltipId = 0; + static u32 s_tooltipId = 0; u32 addTooltip(Region region, std::string value, color_t color) { - tooltipId++; - impl::s_tooltips->insert({ tooltipId, { region, std::move(value), color } }); + s_tooltipId++; + impl::s_tooltips->insert({ s_tooltipId, { region, std::move(value), color } }); - return tooltipId; + return s_tooltipId; } void removeTooltip(u32 id) { impl::s_tooltips->erase(id); } - static u32 tooltipFunctionId; + static u32 s_tooltipFunctionId; u32 addTooltipProvider(TooltipFunction function) { - tooltipFunctionId++; - impl::s_tooltipFunctions->insert({ tooltipFunctionId, std::move(function) }); + s_tooltipFunctionId++; + impl::s_tooltipFunctions->insert({ s_tooltipFunctionId, std::move(function) }); - return tooltipFunctionId; + return s_tooltipFunctionId; } void removeTooltipProvider(u32 id) { @@ -269,6 +269,7 @@ namespace hex { static i64 s_currentProvider = -1; static AutoReset>> s_providers; + static AutoReset>> s_providersToRemove; namespace impl { @@ -425,20 +426,37 @@ namespace hex { } } - provider->close(); - EventProviderClosed::post(provider); + static std::mutex eraseMutex; + + // Move provider over to a list of providers to delete + eraseMutex.lock(); + auto removeIt = s_providersToRemove->emplace(s_providersToRemove->end(), std::move(*it)); + eraseMutex.unlock(); + + // Remove left over references from the main provider list + s_providers->erase(it); + impl::s_closingProviders.erase(provider); + + if (s_currentProvider >= i64(s_providers->size())) + setCurrentProvider(0); + + if (s_providers->empty()) + EventProviderChanged::post(provider, nullptr); + + EventProviderClosed::post(removeIt->get()); RequestUpdateWindowTitle::post(); - TaskManager::runWhenTasksFinished([it, provider] { - EventProviderDeleted::post(provider); - impl::s_closingProviders.erase(provider); + // Do the destruction of the provider in the background once all tasks have finished + TaskManager::runWhenTasksFinished([removeIt] { + EventProviderDeleted::post(removeIt->get()); + TaskManager::createBackgroundTask("Closing Provider", [removeIt](Task &) { + eraseMutex.lock(); + auto provider = std::move(*removeIt); + s_providersToRemove->erase(removeIt); + eraseMutex.unlock(); - s_providers->erase(it); - if (s_currentProvider >= i64(s_providers->size())) - setCurrentProvider(0); - - if (s_providers->empty()) - EventProviderChanged::post(provider, nullptr); + provider->close(); + }); }); } @@ -615,7 +633,7 @@ namespace hex { } void* getLibImHexModuleHandle() { - return hex::getContainingModule((void*)&getLibImHexModuleHandle); + return hex::getContainingModule(reinterpret_cast(&getLibImHexModuleHandle)); } @@ -745,22 +763,22 @@ namespace hex { } std::optional getLinuxDistro() { - std::ifstream file("/etc/os-release"); + wolv::io::File file("/etc/os-release", wolv::io::File::Mode::Read); std::string name; std::string version; - std::string line; - while (std::getline(file, line)) { + auto fileContent = file.readString(); + for (const auto &line : wolv::util::splitString(fileContent, "\n")) { if (line.find("PRETTY_NAME=") != std::string::npos) { name = line.substr(line.find("=") + 1); - name.erase(std::remove(name.begin(), name.end(), '\"'), name.end()); + std::erase(name, '\"'); } else if (line.find("VERSION_ID=") != std::string::npos) { version = line.substr(line.find("=") + 1); - version.erase(std::remove(version.begin(), version.end(), '\"'), version.end()); + std::erase(version, '\"'); } } - return {{name, version}}; + return { { name, version } }; } std::string getImHexVersion(bool withBuildType) {