From 102b93d3b521cdd01e97dadec552a65bc1e8e712 Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Mon, 28 Mar 2022 20:34:39 +0200 Subject: [PATCH] Fix deadlock when changing condition / action type The video preview dialogs could not exit as the destructor was holding the main mutex while joining the preview thread, which in turn was waiting to get the access to the mutex to exit its main loop --- src/macro-action-edit.cpp | 11 ++++++----- src/macro-condition-edit.cpp | 15 ++++++++------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/macro-action-edit.cpp b/src/macro-action-edit.cpp index 74f96524..7356b294 100644 --- a/src/macro-action-edit.cpp +++ b/src/macro-action-edit.cpp @@ -106,11 +106,12 @@ void MacroActionEdit::ActionSelectionChanged(const QString &text) auto macro = _entryData->get()->GetMacro(); std::string id = MacroActionFactory::GetIdByName(text); HeaderInfoChanged(""); - - std::lock_guard lock(switcher->m); - _entryData->reset(); - *_entryData = MacroActionFactory::Create(id, macro); - (*_entryData)->SetIndex(idx); + { + std::lock_guard lock(switcher->m); + _entryData->reset(); + *_entryData = MacroActionFactory::Create(id, macro); + (*_entryData)->SetIndex(idx); + } auto widget = MacroActionFactory::CreateWidget(id, this, *_entryData); QWidget::connect(widget, SIGNAL(HeaderInfoChanged(const QString &)), this, SLOT(HeaderInfoChanged(const QString &))); diff --git a/src/macro-condition-edit.cpp b/src/macro-condition-edit.cpp index fa202fc5..e48ce675 100644 --- a/src/macro-condition-edit.cpp +++ b/src/macro-condition-edit.cpp @@ -218,13 +218,14 @@ void MacroConditionEdit::ConditionSelectionChanged(const QString &text) auto temp = DurationConstraint(); _dur->SetValue(temp); HeaderInfoChanged(""); - - std::lock_guard lock(switcher->m); - auto logic = (*_entryData)->GetLogicType(); - _entryData->reset(); - *_entryData = MacroConditionFactory::Create(id, macro); - (*_entryData)->SetIndex(idx); - (*_entryData)->SetLogicType(logic); + { + std::lock_guard lock(switcher->m); + auto logic = (*_entryData)->GetLogicType(); + _entryData->reset(); + *_entryData = MacroConditionFactory::Create(id, macro); + (*_entryData)->SetIndex(idx); + (*_entryData)->SetLogicType(logic); + } auto widget = MacroConditionFactory::CreateWidget(id, this, *_entryData); QWidget::connect(widget, SIGNAL(HeaderInfoChanged(const QString &)),