diff --git a/lib/libimhex/source/api/task.cpp b/lib/libimhex/source/api/task.cpp index 5dd97f499..83bdec0ff 100644 --- a/lib/libimhex/source/api/task.cpp +++ b/lib/libimhex/source/api/task.cpp @@ -239,12 +239,13 @@ namespace hex { } void TaskManager::collectGarbage() { - std::unique_lock lock1(s_queueMutex); - std::unique_lock lock2(s_deferredCallsMutex); - - std::erase_if(s_tasks, [](const auto &task) { return task->isFinished() && !task->hadException(); }); + { + std::unique_lock lock1(s_queueMutex); + std::erase_if(s_tasks, [](const auto &task) { return task->isFinished() && !task->hadException(); }); + } if (s_tasks.empty()) { + std::unique_lock lock2(s_deferredCallsMutex); for (auto &call : s_tasksFinishedCallbacks) call(); s_tasksFinishedCallbacks.clear(); diff --git a/plugins/builtin/source/content/providers.cpp b/plugins/builtin/source/content/providers.cpp index cf129c2c0..4927c28aa 100644 --- a/plugins/builtin/source/content/providers.cpp +++ b/plugins/builtin/source/content/providers.cpp @@ -41,7 +41,18 @@ namespace hex::plugin::builtin { auto providerSettings = nlohmann::json::parse(tar.readString(basePath / hex::format("{}.json", id))); auto provider = ImHexApi::Provider::createProvider(providerSettings["type"].get(), true); - ON_SCOPE_EXIT { if (!success) ImHexApi::Provider::remove(provider, true); }; + ON_SCOPE_EXIT { + if (!success) { + for (auto &task : TaskManager::getRunningTasks()) + task->interrupt(); + + TaskManager::runWhenTasksFinished([]{ + for (auto provider : ImHexApi::Provider::getProviders()) + ImHexApi::Provider::remove(provider, true); + }); + } + }; + if (provider == nullptr) { success = false; continue;