From f8936ebcb1b8c95bfa5969ac92cfbde87023778c Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sun, 24 Apr 2016 00:24:43 +0200 Subject: Disconnect Signals before dropping ports significantly speeds up session close --- libs/ardour/ardour/port.h | 2 ++ libs/ardour/port.cc | 8 ++++++++ libs/ardour/session.cc | 17 +++++++++++++---- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/libs/ardour/ardour/port.h b/libs/ardour/ardour/port.h index 9f9a4d88df..619b8ba0f2 100644 --- a/libs/ardour/ardour/port.h +++ b/libs/ardour/ardour/port.h @@ -125,6 +125,7 @@ public: PBD::Signal1 MonitorInputChanged; static PBD::Signal2,boost::shared_ptr > PostDisconnect; static PBD::Signal0 PortDrop; + static PBD::Signal0 PortSignalDrop; static void set_cycle_framecnt (pframes_t n) { _cycle_nframes = n; @@ -170,6 +171,7 @@ private: std::set _connections; void port_connected_or_disconnected (boost::weak_ptr, boost::weak_ptr, bool); + void signal_drop (); void drop (); PBD::ScopedConnection drop_connection; PBD::ScopedConnection engine_connection; diff --git a/libs/ardour/port.cc b/libs/ardour/port.cc index dcb3e2ff4a..7888167a70 100644 --- a/libs/ardour/port.cc +++ b/libs/ardour/port.cc @@ -38,6 +38,7 @@ using namespace PBD; PBD::Signal2, boost::shared_ptr > Port::PostDisconnect; PBD::Signal0 Port::PortDrop; +PBD::Signal0 Port::PortSignalDrop; bool Port::_connecting_blocked = false; pframes_t Port::_global_port_buffer_offset = 0; @@ -75,6 +76,7 @@ Port::Port (std::string const & n, DataType t, PortFlags f) } PortDrop.connect_same_thread (drop_connection, boost::bind (&Port::drop, this)); + PortSignalDrop.connect_same_thread (drop_connection, boost::bind (&Port::signal_drop, this)); port_manager->PortConnectedOrDisconnected.connect_same_thread (engine_connection, boost::bind (&Port::port_connected_or_disconnected, this, _1, _3, _5)); } @@ -118,6 +120,12 @@ Port::set_pretty_name(const std::string& n) return false; } +void +Port::signal_drop () +{ + engine_connection.disconnect (); +} + void Port::drop () { diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index b93d685bfc..3b03985ece 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -591,6 +591,9 @@ Session::destroy () _state_of_the_state = StateOfTheState (CannotSave|Deletion); + /* stop autoconnecting */ + auto_connect_thread_terminate (); + /* disconnect from any and all signals that we are connected to */ drop_connections (); @@ -613,6 +616,7 @@ Session::destroy () * callbacks from the engine any more. */ + Port::PortSignalDrop (); /* EMIT SIGNAL */ Port::PortDrop (); /* EMIT SIGNAL */ ltc_tx_cleanup(); @@ -725,8 +729,6 @@ Session::destroy () pthread_cond_destroy (&_rt_emit_cond); pthread_mutex_destroy (&_rt_emit_mutex); - auto_connect_thread_terminate (); - pthread_cond_destroy (&_auto_connect_cond); pthread_mutex_destroy (&_auto_connect_mutex); @@ -6791,12 +6793,12 @@ Session::auto_connect_thread_start () if (_ac_thread_active) { return; } - _ac_thread_active = true; - // clear queue + while (!_auto_connect_queue.empty ()) { _auto_connect_queue.pop (); } + _ac_thread_active = true; if (pthread_create (&_auto_connect_thread, NULL, auto_connect_thread, this)) { _ac_thread_active = false; } @@ -6810,6 +6812,13 @@ Session::auto_connect_thread_terminate () } _ac_thread_active = false; + { + Glib::Threads::Mutex::Lock lx (_auto_connect_queue_lock); + while (!_auto_connect_queue.empty ()) { + _auto_connect_queue.pop (); + } + } + if (pthread_mutex_lock (&_auto_connect_mutex) == 0) { pthread_cond_signal (&_auto_connect_cond); pthread_mutex_unlock (&_auto_connect_mutex); -- cgit v1.2.3