From 27859e83b382e3ec0eec4343c53bbd12abd363ce Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Thu, 15 Aug 2024 23:54:18 +0200 Subject: [PATCH] Fix crash when creating macro which uses macro segment factories --- lib/macro/macro-action-factory.cpp | 14 +++++++------- lib/macro/macro-condition-factory.cpp | 16 ++++++++-------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/lib/macro/macro-action-factory.cpp b/lib/macro/macro-action-factory.cpp index 38c6924e..39406f25 100644 --- a/lib/macro/macro-action-factory.cpp +++ b/lib/macro/macro-action-factory.cpp @@ -21,7 +21,7 @@ public: } // namespace -static std::mutex mutex; +static std::recursive_mutex mutex; std::map &MacroActionFactory::GetMap() { @@ -31,7 +31,7 @@ std::map &MacroActionFactory::GetMap() bool MacroActionFactory::Register(const std::string &id, MacroActionInfo info) { - std::lock_guard lock(mutex); + std::lock_guard lock(mutex); if (auto it = GetMap().find(id); it == GetMap().end()) { GetMap()[id] = info; return true; @@ -41,7 +41,7 @@ bool MacroActionFactory::Register(const std::string &id, MacroActionInfo info) bool MacroActionFactory::Deregister(const std::string &id) { - std::lock_guard lock(mutex); + std::lock_guard lock(mutex); if (GetMap().count(id) == 0) { return false; } @@ -57,7 +57,7 @@ static std::shared_ptr createUnknownAction(Macro *m) std::shared_ptr MacroActionFactory::Create(const std::string &id, Macro *m) { - std::lock_guard lock(mutex); + std::lock_guard lock(mutex); if (auto it = GetMap().find(id); it != GetMap().end()) { return it->second._create(m); } @@ -74,7 +74,7 @@ QWidget *MacroActionFactory::CreateWidget(const std::string &id, QWidget *parent, std::shared_ptr action) { - std::lock_guard lock(mutex); + std::lock_guard lock(mutex); if (auto it = GetMap().find(id); it != GetMap().end()) { return it->second._createWidget(parent, action); } @@ -84,7 +84,7 @@ QWidget *MacroActionFactory::CreateWidget(const std::string &id, std::string MacroActionFactory::GetActionName(const std::string &id) { - std::lock_guard lock(mutex); + std::lock_guard lock(mutex); if (auto it = GetMap().find(id); it != GetMap().end()) { return it->second._name; } @@ -93,7 +93,7 @@ std::string MacroActionFactory::GetActionName(const std::string &id) std::string MacroActionFactory::GetIdByName(const QString &name) { - std::lock_guard lock(mutex); + std::lock_guard lock(mutex); for (auto it : GetMap()) { if (name == obs_module_text(it.second._name.c_str())) { return it.first; diff --git a/lib/macro/macro-condition-factory.cpp b/lib/macro/macro-condition-factory.cpp index 6f456c0d..d09b4fd7 100644 --- a/lib/macro/macro-condition-factory.cpp +++ b/lib/macro/macro-condition-factory.cpp @@ -17,7 +17,7 @@ public: } // namespace -static std::mutex mutex; +static std::recursive_mutex mutex; std::map &MacroConditionFactory::GetMap() { @@ -28,7 +28,7 @@ std::map &MacroConditionFactory::GetMap() bool MacroConditionFactory::Register(const std::string &id, MacroConditionInfo info) { - std::lock_guard lock(mutex); + std::lock_guard lock(mutex); if (auto it = GetMap().find(id); it == GetMap().end()) { GetMap()[id] = info; return true; @@ -38,7 +38,7 @@ bool MacroConditionFactory::Register(const std::string &id, bool MacroConditionFactory::Deregister(const std::string &id) { - std::lock_guard lock(mutex); + std::lock_guard lock(mutex); if (GetMap().count(id) == 0) { return false; } @@ -54,7 +54,7 @@ static std::shared_ptr createUnknownCondition(Macro *m) std::shared_ptr MacroConditionFactory::Create(const std::string &id, Macro *m) { - std::lock_guard lock(mutex); + std::lock_guard lock(mutex); if (auto it = GetMap().find(id); it != GetMap().end()) { return it->second._create(m); } @@ -71,7 +71,7 @@ QWidget * MacroConditionFactory::CreateWidget(const std::string &id, QWidget *parent, std::shared_ptr cond) { - std::lock_guard lock(mutex); + std::lock_guard lock(mutex); if (auto it = GetMap().find(id); it != GetMap().end()) { return it->second._createWidget(parent, cond); } @@ -80,7 +80,7 @@ MacroConditionFactory::CreateWidget(const std::string &id, QWidget *parent, std::string MacroConditionFactory::GetConditionName(const std::string &id) { - std::lock_guard lock(mutex); + std::lock_guard lock(mutex); if (auto it = GetMap().find(id); it != GetMap().end()) { return it->second._name; } @@ -89,7 +89,7 @@ std::string MacroConditionFactory::GetConditionName(const std::string &id) std::string MacroConditionFactory::GetIdByName(const QString &name) { - std::lock_guard lock(mutex); + std::lock_guard lock(mutex); for (auto it : GetMap()) { if (name == obs_module_text(it.second._name.c_str())) { return it.first; @@ -100,7 +100,7 @@ std::string MacroConditionFactory::GetIdByName(const QString &name) bool MacroConditionFactory::UsesDurationModifier(const std::string &id) { - std::lock_guard lock(mutex); + std::lock_guard lock(mutex); if (auto it = GetMap().find(id); it != GetMap().end()) { return it->second._useDurationModifier; }