From d9767b10ac4493cf1b76c6b8afd920e2584ef39e Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Mon, 3 Jul 2017 14:03:10 +0200 Subject: Fix another crash at exit. During ARDOUR_UI::finish(), after destroying various instances: close_all_dialogs() -> ArdourDialog::on_response() -> GUIIdle() The event loop recurses and may execute a previously scheduled Editor::idle_visual_changer() --- gtk2_ardour/ardour_dialog.cc | 13 ++++++++++++- gtk2_ardour/ardour_dialog.h | 1 + gtk2_ardour/editor_videotimeline.cc | 3 +++ 3 files changed, 16 insertions(+), 1 deletion(-) (limited to 'gtk2_ardour') diff --git a/gtk2_ardour/ardour_dialog.cc b/gtk2_ardour/ardour_dialog.cc index c7d78099ce..1c9da0112f 100644 --- a/gtk2_ardour/ardour_dialog.cc +++ b/gtk2_ardour/ardour_dialog.cc @@ -67,6 +67,17 @@ ArdourDialog::on_response (int response_id) Gtk::Dialog::on_response (response_id); } +void +ArdourDialog::close_self () +{ + /* Don't call Idle, don't pop splash. + * This is used at exit and session-close and invoked + * via close_all_dialogs. + */ + hide (); + Gtk::Dialog::on_response (RESPONSE_CANCEL); +} + void ArdourDialog::pop_splash () { @@ -138,7 +149,7 @@ ArdourDialog::init () set_transient_for (*parent); } - ARDOUR_UI::CloseAllDialogs.connect (sigc::bind (sigc::mem_fun (*this, &ArdourDialog::response), RESPONSE_CANCEL)); + ARDOUR_UI::CloseAllDialogs.connect (sigc::mem_fun (*this, &ArdourDialog::close_self)); /* send a RESPONSE_CANCEL to self */ proxy = new WM::ProxyTemporary (get_title(), this); WM::Manager::instance().register_window (proxy); diff --git a/gtk2_ardour/ardour_dialog.h b/gtk2_ardour/ardour_dialog.h index 9e91d3e97e..76d7ac1d08 100644 --- a/gtk2_ardour/ardour_dialog.h +++ b/gtk2_ardour/ardour_dialog.h @@ -51,6 +51,7 @@ public: protected: void pop_splash (); + void close_self (); private: WM::ProxyTemporary* proxy; diff --git a/gtk2_ardour/editor_videotimeline.cc b/gtk2_ardour/editor_videotimeline.cc index e5f5db3465..e087034af0 100644 --- a/gtk2_ardour/editor_videotimeline.cc +++ b/gtk2_ardour/editor_videotimeline.cc @@ -53,6 +53,9 @@ Editor::set_video_timeline_height (const int h) void Editor::update_video_timeline (bool flush) { + // catch GUIIdle -> Editor::idle_visual_changer during quit/close + assert (ARDOUR_UI::instance()->video_timeline); + if (flush) { ARDOUR_UI::instance()->video_timeline->flush_local_cache(); } -- cgit v1.2.3