1
0
mirror of synced 2025-01-19 01:24:15 +01:00

impr: Allow providers to be closed quicker after being opened

This commit is contained in:
WerWolv 2024-05-17 21:56:43 +02:00
parent cf480d95db
commit 563bf78f03
6 changed files with 39 additions and 9 deletions

View File

@ -9,6 +9,7 @@
#include <string>
#include <vector>
#include <map>
#include <set>
#include <wolv/io/fs.hpp>
@ -292,7 +293,7 @@ namespace hex {
namespace impl {
void resetClosingProvider();
const std::vector<prv::Provider*>& getClosingProviders();
const std::set<prv::Provider*>& getClosingProviders();
}

View File

@ -78,6 +78,10 @@ namespace hex {
m_onCreateCallback = std::move(callback);
}
void setOnDestroyCallback(std::function<void(prv::Provider *, T&)> callback) {
m_onDestroyCallback = std::move(callback);
}
private:
void onCreate() {
EventProviderOpened::subscribe(this, [this](prv::Provider *provider) {
@ -88,7 +92,12 @@ namespace hex {
});
EventProviderDeleted::subscribe(this, [this](prv::Provider *provider){
m_data.erase(provider);
if (auto it = m_data.find(provider); it != m_data.end()) {
if (m_onDestroyCallback)
m_onDestroyCallback(provider, m_data.at(provider));
m_data.erase(it);
}
});
EventImHexClosing::subscribe(this, [this] {
@ -113,6 +122,7 @@ namespace hex {
}
void onDestroy() {
EventProviderOpened::unsubscribe(this);
EventProviderDeleted::unsubscribe(this);
EventImHexClosing::unsubscribe(this);
@ -121,7 +131,7 @@ namespace hex {
private:
std::map<const prv::Provider *, T> m_data;
std::function<void(prv::Provider *, T&)> m_onCreateCallback;
std::function<void(prv::Provider *, T&)> m_onCreateCallback, m_onDestroyCallback;
};
}

View File

@ -14,6 +14,7 @@
#include <imgui.h>
#include <imgui_internal.h>
#include <set>
#include <GLFW/glfw3.h>
#if defined(OS_WINDOWS)
@ -269,15 +270,16 @@ namespace hex {
namespace impl {
static std::vector<prv::Provider*> s_closingProviders;
static std::set<prv::Provider*> s_closingProviders;
void resetClosingProvider() {
s_closingProviders.clear();
}
const std::vector<prv::Provider*>& getClosingProviders() {
const std::set<prv::Provider*>& getClosingProviders() {
return s_closingProviders;
}
static std::recursive_mutex s_providerMutex;
}
prv::Provider *get() {
@ -297,6 +299,8 @@ namespace hex {
}
void setCurrentProvider(i64 index) {
std::scoped_lock lock(impl::s_providerMutex);
if (TaskManager::getRunningTaskCount() > 0)
return;
@ -310,6 +314,8 @@ namespace hex {
}
void setCurrentProvider(NonNull<prv::Provider*> provider) {
std::scoped_lock lock(impl::s_providerMutex);
if (TaskManager::getRunningTaskCount() > 0)
return;
@ -344,6 +350,8 @@ namespace hex {
}
void add(std::unique_ptr<prv::Provider> &&provider, bool skipLoadInterface, bool select) {
std::scoped_lock lock(impl::s_providerMutex);
if (TaskManager::getRunningTaskCount() > 0)
return;
@ -358,14 +366,19 @@ namespace hex {
}
void remove(prv::Provider *provider, bool noQuestions) {
std::scoped_lock lock(impl::s_providerMutex);
if (provider == nullptr)
return;
if (TaskManager::getRunningTaskCount() > 0)
return;
if (impl::s_closingProviders.contains(provider))
return;
if (!noQuestions) {
impl::s_closingProviders.push_back(provider);
impl::s_closingProviders.insert(provider);
bool shouldClose = true;
EventProviderClosing::post(provider, &shouldClose);
@ -419,7 +432,7 @@ namespace hex {
TaskManager::runWhenTasksFinished([it, provider] {
EventProviderDeleted::post(provider);
std::erase(impl::s_closingProviders, provider);
impl::s_closingProviders.erase(provider);
s_providers->erase(it);
if (s_currentProvider >= i64(s_providers->size()))
@ -441,7 +454,6 @@ namespace hex {
namespace ImHexApi::System {
namespace impl {
// Default to true means we forward to ourselves by default

View File

@ -426,6 +426,10 @@ namespace hex {
void TaskManager::runWhenTasksFinished(const std::function<void()> &function) {
std::scoped_lock lock(s_tasksFinishedMutex);
for (const auto &task : s_tasks) {
task->interrupt();
}
s_tasksFinishedCallbacks.push_back(function);
}

View File

@ -218,6 +218,7 @@ namespace hex::plugin::builtin {
PerProvider<std::list<EnvVar>> m_envVarEntries;
PerProvider<TaskHolder> m_analysisTask;
PerProvider<bool> m_shouldAnalyze;
PerProvider<bool> m_breakpointHit;
PerProvider<std::unique_ptr<ui::PatternDrawer>> m_debuggerDrawer;

View File

@ -1328,7 +1328,7 @@ namespace hex::plugin::builtin {
if (m_shouldAnalyze) {
m_shouldAnalyze = false;
TaskManager::createBackgroundTask("Analyzing file content", [this, provider](auto &) {
m_analysisTask = TaskManager::createBackgroundTask("Analyzing file content", [this, provider](const Task &task) {
if (!m_autoLoadPatterns)
return;
@ -1415,6 +1415,8 @@ namespace hex::plugin::builtin {
std::error_code errorCode;
for (const auto &dir : fs::getDefaultPaths(fs::ImHexPath::Patterns)) {
for (auto &entry : std::fs::recursive_directory_iterator(dir, errorCode)) {
task.update();
foundCorrectType = false;
if (!entry.is_regular_file())
continue;