Prevent deadlock when disconnecting

Multimedia / Ardour - Robin Gareus [gareus.org] - 4 February 2021 20:06 UTC

The backend holds `_port_callback_mutex` while disconnecting ports. In some cases disconnecting a port can drop the last reference resulting in a port-deletion from the connection handler. This in turn will eventually aquire the `_port_callback_mutex` and deadlock.

This is now circumvented by using atomic operations instead of taking a lock to set the `_port_change_flag`.

The flag is also used to trigger a latency update in some cases, atomic is preferable to taking a lock to set this flag.

--

Full bt: https://paste.debian.net/1184056/ Short:

#1 in pthread_mutex_lock () #2 in ARDOUR::PortEngineSharedImpl::port_connect_add_remove_callback() #3 in ARDOUR::BackendPort::~BackendPort() #4 in ARDOUR::DummyPort::~DummyPort() #6 in ARDOUR::DummyAudioPort::~DummyAudioPort() #7 in boost::checked_delete(ARDOUR::BackendPort*) #12 in boost::shared_ptr::reset() #13 in ARDOUR::Port::drop() #14 in ARDOUR::Port::~Port() #15 in ARDOUR::AudioPort::~AudioPort() #17 in ARDOUR::AudioEngine::add_pending_port_deletion(ARDOUR::Port*) #20 in boost::detail::sp_counted_base::release() #37 in ARDOUR::PortManager::connect_callback() at libs/ardour/port_manager.cc:788 #38 in ARDOUR::DummyAudioBackend::main_process_thread() at libs/backends/dummy/dummy_audiobackend.cc:1018

634d325e5d Prevent deadlock when disconnecting
libs/ardour/ardour/port_engine_shared.h | 7 +++----
libs/ardour/port_engine_shared.cc | 4 ++--
libs/backends/alsa/alsa_audiobackend.cc | 5 ++---
libs/backends/coreaudio/coreaudio_backend.cc | 15 +++++++--------
libs/backends/dummy/dummy_audiobackend.cc | 5 ++---
libs/backends/portaudio/portaudio_backend.cc | 7 ++-----
libs/backends/pulseaudio/pulseaudio_backend.cc | 7 +++----
7 files changed, 21 insertions(+), 29 deletions(-)

  • Share