From bdf9625b0a7f210ff967c8bfe3ae3ee43a43c64a Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 16 Aug 2022 01:38:28 +0200 Subject: [PATCH] Fix deadlock on cancelling jobs. --- src/tools/dcpomatic.cc | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/tools/dcpomatic.cc b/src/tools/dcpomatic.cc index 6f55b1771..57fad5a0a 100644 --- a/src/tools/dcpomatic.cc +++ b/src/tools/dcpomatic.cc @@ -372,7 +372,7 @@ public: _film_editor->content_panel()->SelectionChanged.connect (boost::bind (&DOMFrame::set_menu_sensitivity, this)); set_title (); - JobManager::instance()->ActiveJobsChanged.connect (boost::bind (&DOMFrame::set_menu_sensitivity, this)); + JobManager::instance()->ActiveJobsChanged.connect(boost::bind(&DOMFrame::active_jobs_changed, this)); overall_panel->SetSizer (main_sizer); @@ -1200,6 +1200,15 @@ private: ev.Skip (); } + void active_jobs_changed() + { + /* ActiveJobsChanged can be called while JobManager holds a lock on its mutex, making + * the call to JobManager::get() in set_menu_sensitivity() deadlock unless we work around + * it by using an idle callback. This feels quite unpleasant. + */ + signal_manager->when_idle(boost::bind(&DOMFrame::set_menu_sensitivity, this)); + } + void set_menu_sensitivity () { auto jobs = JobManager::instance()->get (); -- 2.30.2