From f5727e50d138e32e2a2bba0f2c1d8b03a12dfc75 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sun, 19 Jul 2020 01:00:16 +0200 Subject: [PATCH] Another attempt at fixing the auto-connect race condition --- libs/ardour/session.cc | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index 1104a7b2b0..8b10e2ad2f 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -6876,7 +6876,7 @@ Session::auto_connect_route (boost::shared_ptr route, input_start, output_start, input_offset, output_offset)); - lx.release (); + lx.release (); // XXX check try-lock + pthread_cond_wait auto_connect_thread_wakeup (); } @@ -7054,9 +7054,10 @@ Session::auto_connect_thread_run () SessionEvent::create_per_thread_pool (X_("autoconnect"), 1024); PBD::notify_event_loops_about_thread_creation (pthread_self(), X_("autoconnect"), 1024); pthread_mutex_lock (&_auto_connect_mutex); + + Glib::Threads::Mutex::Lock lx (_auto_connect_queue_lock); while (g_atomic_int_get (&_ac_thread_active)) { - Glib::Threads::Mutex::Lock lx (_auto_connect_queue_lock); if (!_auto_connect_queue.empty ()) { /* Why would we need the process lock? * @@ -7100,8 +7101,14 @@ Session::auto_connect_thread_run () AudioEngine::instance()->clear_pending_port_deletions (); } - pthread_cond_wait (&_auto_connect_cond, &_auto_connect_mutex); + lx.acquire (); + if (_auto_connect_queue.empty ()) { + lx.release (); + pthread_cond_wait (&_auto_connect_cond, &_auto_connect_mutex); + lx.acquire (); + } } + lx.release (); pthread_mutex_unlock (&_auto_connect_mutex); }