From 2b1b0aa240f9ae166997e9eb96496459c5c63353 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sat, 1 Jul 2017 03:10:50 +0200 Subject: Fix crash when rapidly switching snapshots ARDOUR_UI::load_session() calls flush_pending() which runs gtk_main_iteration()s until idle. If a user selects another snapshot from the sidebar, load_session() is called again (from a call to load session) --- gtk2_ardour/ardour_ui.cc | 14 ++++++++++++++ gtk2_ardour/ardour_ui.h | 1 + gtk2_ardour/editor_snapshots.cc | 2 ++ 3 files changed, 17 insertions(+) diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 5cec015268..6076cb71c6 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -62,6 +62,7 @@ #include "pbd/openuri.h" #include "pbd/stl_delete.h" #include "pbd/types_convert.h" +#include "pbd/unwind.h" #include "pbd/file_utils.h" #include "pbd/localtime_r.h" #include "pbd/pthread_utils.h" @@ -263,6 +264,7 @@ libxml_structured_error_func (void* /* parsing_context*/, ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir) : Gtkmm2ext::UI (PROGRAM_NAME, X_("gui"), argcp, argvp) , session_loaded (false) + , session_load_in_progress (false) , gui_object_state (new GUIObjectState) , primary_clock (new MainClock (X_("primary"), X_("transport"), true )) , secondary_clock (new MainClock (X_("secondary"), X_("secondary"), false)) @@ -3614,6 +3616,18 @@ ARDOUR_UI::close_session() int ARDOUR_UI::load_session (const std::string& path, const std::string& snap_name, std::string mix_template) { + /* load_session calls flush_pending() which allows + * GUI interaction and potentially loading another session + * (that was easy via snapshot sidebar). + * Recursing into load_session() from load_session() and recusive + * event loops causes all kind of crashes. + */ + assert (!session_load_in_progress); + if (session_load_in_progress) { + return -1; + } + PBD::Unwinder lsu (session_load_in_progress, true); + Session *new_session; int unload_status; int retval = -1; diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h index b2240ad4ff..6fe52ead7b 100644 --- a/gtk2_ardour/ardour_ui.h +++ b/gtk2_ardour/ardour_ui.h @@ -188,6 +188,7 @@ public: int load_session (const std::string& path, const std::string& snapshot, std::string mix_template = std::string()); bool session_loaded; + bool session_load_in_progress; int build_session (const std::string& path, const std::string& snapshot, ARDOUR::BusProfile&); bool session_is_new() const { return _session_is_new; } diff --git a/gtk2_ardour/editor_snapshots.cc b/gtk2_ardour/editor_snapshots.cc index b90737cd08..90521cd07d 100644 --- a/gtk2_ardour/editor_snapshots.cc +++ b/gtk2_ardour/editor_snapshots.cc @@ -89,7 +89,9 @@ EditorSnapshots::selection_changed () return; } + _display.set_sensitive (false); ARDOUR_UI::instance()->load_session (_session->path(), string (snap_name)); + _display.set_sensitive (true); } } -- cgit v1.2.3