From b25da08b468267771c83064c1cca8ebf5491e761 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Mon, 6 Sep 2010 21:06:10 +0000 Subject: [PATCH] Another hacky fix for deadlocks when updating the port matrix. git-svn-id: svn://localhost/ardour2/branches/3.0@7747 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/port_matrix.cc | 12 +++++++++++- gtk2_ardour/port_matrix.h | 1 + 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/gtk2_ardour/port_matrix.cc b/gtk2_ardour/port_matrix.cc index 1c89a36af7..113a11c116 100644 --- a/gtk2_ardour/port_matrix.cc +++ b/gtk2_ardour/port_matrix.cc @@ -154,7 +154,7 @@ PortMatrix::init () _session->engine().PortRegisteredOrUnregistered.connect (_session_connections, invalidator (*this), boost::bind (&PortMatrix::setup_global_ports, this), gui_context()); /* watch for route order keys changing, which changes the order of things in our global ports list(s) */ - _session->RouteOrderKeyChanged.connect (_session_connections, invalidator (*this), boost::bind (&PortMatrix::setup_global_ports, this), gui_context()); + _session->RouteOrderKeyChanged.connect (_session_connections, invalidator (*this), boost::bind (&PortMatrix::setup_global_ports_proxy, this), gui_context()); /* Part 3: other stuff */ @@ -575,6 +575,16 @@ PortMatrix::setup_global_ports () } } +void +PortMatrix::setup_global_ports_proxy () +{ + /* Avoid a deadlock by calling this in an idle handler: see IOSelector::io_changed_proxy + for a discussion. + */ + + Glib::signal_idle().connect_once (sigc::mem_fun (*this, &PortMatrix::setup_global_ports)); +} + void PortMatrix::setup_all_ports () { diff --git a/gtk2_ardour/port_matrix.h b/gtk2_ardour/port_matrix.h index a67292829b..359b4540e3 100644 --- a/gtk2_ardour/port_matrix.h +++ b/gtk2_ardour/port_matrix.h @@ -180,6 +180,7 @@ private: void disassociate_all_on_channel (boost::weak_ptr, uint32_t, int); void disassociate_all_on_bundle (boost::weak_ptr, int); void setup_global_ports (); + void setup_global_ports_proxy (); void toggle_show_only_bundles (); bool on_scroll_event (GdkEventScroll *); boost::shared_ptr io_from_bundle (boost::shared_ptr) const;