summaryrefslogtreecommitdiff
path: root/libs/backends
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2020-04-08 19:56:33 -0600
committerPaul Davis <paul@linuxaudiosystems.com>2020-04-08 19:56:33 -0600
commit70f13a3ff3a96d9991e739a11a42bb62c0f71be6 (patch)
tree269b793a65053803475dc65e2b57adcf9c28934e /libs/backends
parentfeff57d29aa9af698d38d093fc5df0dbc2c961a8 (diff)
use RCU to manage JACK backend's container of ports
Diffstat (limited to 'libs/backends')
-rw-r--r--libs/backends/jack/jack_audiobackend.cc9
-rw-r--r--libs/backends/jack/jack_audiobackend.h4
-rw-r--r--libs/backends/jack/jack_portengine.cc42
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);
}