summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2022-08-16 01:38:28 +0200
committerCarl Hetherington <cth@carlh.net>2022-08-16 01:38:36 +0200
commitbdf9625b0a7f210ff967c8bfe3ae3ee43a43c64a (patch)
tree159aac7761c4c4d3f3c0fbc80abc524ba00baff8
parente03f50c7d9c3d286fc60716c5d4bb913c2c1e0af (diff)
Fix deadlock on cancelling jobs.v2.16.21
-rw-r--r--src/tools/dcpomatic.cc11
1 files changed, 10 insertions, 1 deletions
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 ();