From 678c30117c235122beb0acfa2295ec5c844b17f9 Mon Sep 17 00:00:00 2001 From: Igor Korsukov Date: Thu, 28 May 2026 13:22:15 +0200 Subject: [PATCH] fixed thread safe inject --- .../kors_modularity/modularity/modulesioc.h | 72 ++++++++++++------- 1 file changed, 46 insertions(+), 26 deletions(-) diff --git a/framework/global/thirdparty/kors_modularity/modularity/modulesioc.h b/framework/global/thirdparty/kors_modularity/modularity/modulesioc.h index 3b17f489b9..018ab962b6 100644 --- a/framework/global/thirdparty/kors_modularity/modularity/modulesioc.h +++ b/framework/global/thirdparty/kors_modularity/modularity/modulesioc.h @@ -30,6 +30,7 @@ SOFTWARE. #include #include #include +#include #include "imoduleinterface.h" @@ -138,7 +139,14 @@ class ModulesIoCBase void reset() { - for (auto& s : m_map) { + std::map copy; + { + std::lock_guard lock(m_mutex); + copy = m_map; + m_map.clear(); + } + + for (auto& s : copy) { Service& inj = s.second; inj.p = nullptr; @@ -146,7 +154,6 @@ class ModulesIoCBase c.second(inj.p); } } - m_map.clear(); } ModulesIoCBase() = default; @@ -155,16 +162,20 @@ class ModulesIoCBase void unregisterService(const InterfaceInfo& info) { - auto it = m_map.find(info.id); - if (it == m_map.end()) { - return; - } + std::map onChanges; + { + std::lock_guard lock(m_mutex); + auto it = m_map.find(info.id); + if (it == m_map.end()) { + return; + } - Service& inj = it->second; - inj.p = nullptr; + it->second.p = nullptr; + onChanges = it->second.onChanges; + } - for (const auto& c : inj.onChanges) { - c.second(inj.p); + for (const auto& c : onChanges) { + c.second(nullptr); } } @@ -177,25 +188,31 @@ class ModulesIoCBase return; } - auto foundIt = m_map.find(info.id); - if (foundIt != m_map.end()) { - Service& inj = foundIt->second; - if (inj.p) { - std::cerr << module << ": double register:" - << info.id << ", first register in" << m_map[info.id].sourceModule << std::endl; - assert(false); + std::map onChanges; + { + std::lock_guard lock(m_mutex); + auto foundIt = m_map.find(info.id); + if (foundIt != m_map.end()) { + Service& inj = foundIt->second; + if (inj.p) { + std::cerr << module << ": double register:" + << info.id << ", first register in" << m_map[info.id].sourceModule << std::endl; + assert(false); + } else { + inj.sourceModule = module; + inj.p = p; + onChanges = inj.onChanges; + } } else { + Service inj; inj.sourceModule = module; inj.p = p; - for (const auto& c : inj.onChanges) { - c.second(inj.p); - } + m_map[info.id] = inj; } - } else { - Service inj; - inj.sourceModule = module; - inj.p = p; - m_map[info.id] = inj; + } + + for (const auto& c : onChanges) { + c.second(p); } } @@ -203,7 +220,7 @@ class ModulesIoCBase const InterfaceInfo& info) { //! TODO add statistics collection / monitoring, who resolves what - + std::lock_guard lock(m_mutex); auto it = m_map.find(info.id); if (it == m_map.end()) { return nullptr; @@ -215,6 +232,7 @@ class ModulesIoCBase using OnChangedInternal = std::function&)>; int doSubscribe(const InterfaceInfo& info, const OnChangedInternal& onChanged) { + std::lock_guard lock(m_mutex); auto it = m_map.find(info.id); if (it == m_map.end()) { return -1; @@ -229,6 +247,7 @@ class ModulesIoCBase void doUnsubscribe(const InterfaceInfo& info, int key) { + std::lock_guard lock(m_mutex); auto it = m_map.find(info.id); if (it == m_map.end()) { return; @@ -266,6 +285,7 @@ class ModulesIoCBase }; } + std::mutex m_mutex; std::map m_map; std::shared_ptr m_alive = std::make_shared(true); };