13
0

use RCU to manage JACK backend's container of ports

This commit is contained in:
Paul Davis 2020-04-08 19:56:33 -06:00
parent feff57d29a
commit 70f13a3ff3
3 changed files with 44 additions and 11 deletions

View File

@ -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

View File

@ -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);

View File

@ -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;
_jack_ports.insert (std::make_pair (jack_port, 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;
}
@ -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);
}