From 7605be809c0da9e52437616ddf71e97d5c94e39d Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Sat, 15 Mar 2025 18:25:03 -0500 Subject: [PATCH] per-instance locking --- repertory/repertory/include/ui/handlers.hpp | 7 ++++--- repertory/repertory/src/ui/handlers.cpp | 22 +++++++++++++++++---- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/repertory/repertory/include/ui/handlers.hpp b/repertory/repertory/include/ui/handlers.hpp index 7b71b386..4ef92302 100644 --- a/repertory/repertory/include/ui/handlers.hpp +++ b/repertory/repertory/include/ui/handlers.hpp @@ -23,6 +23,7 @@ #define REPERTORY_INCLUDE_UI_HANDLERS_HPP_ #include "events/consumers/console_consumer.hpp" +#include namespace repertory::ui { class mgmt_app_config; @@ -48,11 +49,11 @@ private: private: console_consumer console; mutable std::mutex mtx_; + mutable std::unordered_map mtx_lookup_; private: - [[nodiscard]] static auto data_directory_exists(provider_type prov, - std::string_view name) - -> bool; + [[nodiscard]] auto data_directory_exists(provider_type prov, + std::string_view name) const -> bool; void handle_get_mount(auto &&req, auto &&res) const; diff --git a/repertory/repertory/src/ui/handlers.cpp b/repertory/repertory/src/ui/handlers.cpp index 824c80bd..9839ad83 100644 --- a/repertory/repertory/src/ui/handlers.cpp +++ b/repertory/repertory/src/ui/handlers.cpp @@ -150,14 +150,23 @@ handlers::handlers(mgmt_app_config *config, httplib::Server *server) handlers::~handlers() { event_system::instance().stop(); } -auto handlers::data_directory_exists(provider_type prov, std::string_view name) - -> bool { +auto handlers::data_directory_exists(provider_type prov, + std::string_view name) const -> bool { auto data_dir = utils::path::combine(app_config::get_root_data_directory(), { app_config::get_provider_name(prov), name, }); - return utils::file::directory{data_dir}.exists(); + auto ret = utils::file::directory{data_dir}.exists(); + if (ret) { + return ret; + } + + unique_mutex_lock lock(mtx_); + mtx_lookup_.erase( + fmt::format("{}-{}", name, app_config::get_provider_name(prov))); + lock.unlock(); + return ret; } void handlers::handle_get_mount(auto &&req, auto &&res) const { @@ -392,7 +401,12 @@ auto handlers::launch_process(provider_type prov, std::string_view name, auto cmd_line = fmt::format(R"({} {} {})", repertory_binary_, str_type, args); - mutex_lock lock(mtx_); + unique_mutex_lock lock(mtx_); + auto &inst_mtx = mtx_lookup_[fmt::format( + "{}-{}", name, app_config::get_provider_name(prov))]; + lock.unlock(); + + recur_mutex_lock inst_lock(inst_mtx); if (background) { #if defined(_WIN32) system(fmt::format(R"(start "" /b {})", cmd_line).c_str());