diff options
author | Robin Gareus <robin@gareus.org> | 2016-04-24 00:24:43 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2016-04-24 00:24:43 +0200 |
commit | f8936ebcb1b8c95bfa5969ac92cfbde87023778c (patch) | |
tree | 83830fe4728decfaf02940d1a708a1789f414318 /libs | |
parent | 2a7a64a8738413df27e494e67c31695a429f6edc (diff) |
Disconnect Signals before dropping ports
significantly speeds up session close
Diffstat (limited to 'libs')
-rw-r--r-- | libs/ardour/ardour/port.h | 2 | ||||
-rw-r--r-- | libs/ardour/port.cc | 8 | ||||
-rw-r--r-- | 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<void,bool> MonitorInputChanged; static PBD::Signal2<void,boost::shared_ptr<Port>,boost::shared_ptr<Port> > PostDisconnect; static PBD::Signal0<void> PortDrop; + static PBD::Signal0<void> PortSignalDrop; static void set_cycle_framecnt (pframes_t n) { _cycle_nframes = n; @@ -170,6 +171,7 @@ private: std::set<std::string> _connections; void port_connected_or_disconnected (boost::weak_ptr<Port>, boost::weak_ptr<Port>, 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<void,boost::shared_ptr<Port>, boost::shared_ptr<Port> > Port::PostDisconnect; PBD::Signal0<void> Port::PortDrop; +PBD::Signal0<void> 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)); } @@ -119,6 +121,12 @@ Port::set_pretty_name(const std::string& n) } void +Port::signal_drop () +{ + engine_connection.disconnect (); +} + +void Port::drop () { if (_port_handle) { 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); |