From 70f13a3ff3a96d9991e739a11a42bb62c0f71be6 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Wed, 8 Apr 2020 19:56:33 -0600 Subject: [PATCH] use RCU to manage JACK backend's container of ports --- libs/backends/jack/jack_audiobackend.cc | 9 +++++- libs/backends/jack/jack_audiobackend.h | 4 +-- libs/backends/jack/jack_portengine.cc | 42 ++++++++++++++++++++----- 3 files changed, 44 insertions(+), 11 deletions(-) diff --git a/libs/backends/jack/jack_audiobackend.cc b/libs/backends/jack/jack_audiobackend.cc index 254dfa4147..37f5855cf1 100644 --- a/libs/backends/jack/jack_audiobackend.cc +++ b/libs/backends/jack/jack_audiobackend.cc @@ -64,6 +64,7 @@ JACKAudioBackend::JACKAudioBackend (AudioEngine& e, AudioBackendInfo& info, boos , _target_systemic_output_latency (0) , _current_sample_rate (0) , _current_buffer_size (0) + , _jack_ports (new JackPorts) , _session (0) { _jack_connection->Connected.connect_same_thread (jack_connection_connection, boost::bind (&JACKAudioBackend::when_connected_to_jack, this)); @@ -72,7 +73,13 @@ JACKAudioBackend::JACKAudioBackend (AudioEngine& e, AudioBackendInfo& info, boos JACKAudioBackend::~JACKAudioBackend() { - _jack_ports.clear (); + { + RCUWriter writer (_jack_ports); + boost::shared_ptr jp = writer.get_copy (); + jp->clear (); + } + + _jack_ports.flush (); } string diff --git a/libs/backends/jack/jack_audiobackend.h b/libs/backends/jack/jack_audiobackend.h index 1cde158025..449ad2ffc5 100644 --- a/libs/backends/jack/jack_audiobackend.h +++ b/libs/backends/jack/jack_audiobackend.h @@ -302,8 +302,8 @@ class JACKAudioBackend : public AudioBackend { static void _registration_callback (jack_port_id_t, int, void *); static void _connect_callback (jack_port_id_t, jack_port_id_t, int, void *); - typedef std::map > JackPorts; - mutable JackPorts _jack_ports; /* can be modified in ::get_port_by_name () */ + typedef std::map > JackPorts; + mutable SerializedRCUManager _jack_ports; /* can be modified in ::get_port_by_name () */ void connect_callback (jack_port_id_t, jack_port_id_t, int); diff --git a/libs/backends/jack/jack_portengine.cc b/libs/backends/jack/jack_portengine.cc index 36da7c8962..18a9792ff2 100644 --- a/libs/backends/jack/jack_portengine.cc +++ b/libs/backends/jack/jack_portengine.cc @@ -182,16 +182,24 @@ JACKAudioBackend::get_port_by_name (const std::string& name) const return PortEngine::PortPtr(); } - /* check if we have a shared_ptr for this already */ + boost::shared_ptr ports = _jack_ports.reader (); - JackPorts::const_iterator i = _jack_ports.find (jack_port); + JackPorts::const_iterator i = ports->find (jack_port); - if (i != _jack_ports.end()) { + if (i != ports->end()) { return i->second; } - boost::shared_ptr jp (new JackPort (jack_port)); - _jack_ports.insert (std::make_pair (jack_port, jp)); + boost::shared_ptr jp; + + { + RCUWriter writer (_jack_ports); + boost::shared_ptr ports = writer.get_copy(); + jp.reset (new JackPort (jack_port)); + ports->insert (std::make_pair (jack_port, jp)); + } + + _jack_ports.flush (); return jp; } @@ -505,9 +513,18 @@ JACKAudioBackend::register_port (const std::string& shortname, ARDOUR::DataType return PortEngine::PortPtr(); } - boost::shared_ptr jp (new JackPort (jack_port)); + boost::shared_ptr jp; - _jack_ports.insert (std::make_pair (jack_port, jp)); + { + RCUWriter writer (_jack_ports); + boost::shared_ptr ports = writer.get_copy(); + + jp.reset (new JackPort (jack_port)); + + ports->insert (std::make_pair (jack_port, jp)); + } + + _jack_ports.flush(); return jp; } @@ -517,7 +534,16 @@ JACKAudioBackend::unregister_port (PortHandle port) { GET_PRIVATE_JACK_POINTER (_priv_jack); boost::shared_ptr jp = boost::dynamic_pointer_cast(port); - _jack_ports.erase (jp->jack_ptr); + + { + RCUWriter writer (_jack_ports); + boost::shared_ptr ports = writer.get_copy(); + + ports->erase (jp->jack_ptr); + } + + _jack_ports.flush (); + (void) jack_port_unregister (_priv_jack, jp->jack_ptr); }