Fix deadlock on cancelling jobs.
[dcpomatic.git] / src / tools / dcpomatic.cc
index ebcd05a682770c20677d4ca1db22b893d3567303..57fad5a0a49ac031ca42365feebe956fdad23493 100644 (file)
@@ -78,6 +78,7 @@
 #include "lib/kdm_with_metadata.h"
 #include "lib/log.h"
 #include "lib/make_dcp.h"
+#include "lib/release_notes.h"
 #include "lib/screen.h"
 #include "lib/send_kdm_email_job.h"
 #include "lib/signal_manager.h"
@@ -371,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);
 
@@ -1199,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 ();
@@ -1686,6 +1696,14 @@ private:
                        if (Config::instance()->check_for_updates ()) {
                                UpdateChecker::instance()->run ();
                        }
+
+                       auto release_notes = find_release_notes();
+                       if (release_notes) {
+                               auto notes = new HTMLDialog(nullptr, _("Release notes"), std_to_wx(*release_notes), true);
+                               notes->Centre();
+                               notes->ShowModal();
+                               notes->Destroy();
+                       }
                }
                catch (exception& e)
                {