diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2020-04-08 19:56:33 -0600 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2020-04-08 19:56:33 -0600 |
commit | 70f13a3ff3a96d9991e739a11a42bb62c0f71be6 (patch) | |
tree | 269b793a65053803475dc65e2b57adcf9c28934e /libs/backends | |
parent | feff57d29aa9af698d38d093fc5df0dbc2c961a8 (diff) |
use RCU to manage JACK backend's container of ports
Diffstat (limited to 'libs/backends')
-rw-r--r-- | libs/backends/jack/jack_audiobackend.cc | 9 | ||||
-rw-r--r-- | libs/backends/jack/jack_audiobackend.h | 4 | ||||
-rw-r--r-- | 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<JackPorts> writer (_jack_ports); + boost::shared_ptr<JackPorts> 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<void*,boost::shared_ptr<JackPort> > JackPorts; - mutable JackPorts _jack_ports; /* can be modified in ::get_port_by_name () */ + typedef std::map<void*,boost::shared_ptr<JackPort> > JackPorts; + mutable SerializedRCUManager<JackPorts> _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<JackPort> for this already */ + boost::shared_ptr<JackPorts> 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<JackPort> jp (new JackPort (jack_port)); - _jack_ports.insert (std::make_pair (jack_port, jp)); + boost::shared_ptr<JackPort> jp; + + { + RCUWriter<JackPorts> writer (_jack_ports); + boost::shared_ptr<JackPorts> 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<JackPort> jp (new JackPort (jack_port)); + boost::shared_ptr<JackPort> jp; + + { + RCUWriter<JackPorts> writer (_jack_ports); + boost::shared_ptr<JackPorts> ports = writer.get_copy(); + + jp.reset (new JackPort (jack_port)); + + ports->insert (std::make_pair (jack_port, jp)); + } - _jack_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<JackPort> jp = boost::dynamic_pointer_cast<JackPort>(port); - _jack_ports.erase (jp->jack_ptr); + + { + RCUWriter<JackPorts> writer (_jack_ports); + boost::shared_ptr<JackPorts> ports = writer.get_copy(); + + ports->erase (jp->jack_ptr); + } + + _jack_ports.flush (); + (void) jack_port_unregister (_priv_jack, jp->jack_ptr); } |