From d6112f121313f6db8353e32c1339f84cd1e59608 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Mon, 26 Sep 2011 20:35:09 +0000 Subject: Use RCU for MIDI Manager's port list. git-svn-id: svn://localhost/ardour2/branches/3.0@10128 d708f5d6-7413-0410-9779-e7cbd77b26cf --- libs/ardour/midi_ui.cc | 4 ++-- libs/ardour/rc_configuration.cc | 4 ++-- libs/midi++2/manager.cc | 39 ++++++++++++++++++++++++++++----------- libs/midi++2/midi++/manager.h | 8 +++++--- 4 files changed, 37 insertions(+), 18 deletions(-) (limited to 'libs') diff --git a/libs/ardour/midi_ui.cc b/libs/ardour/midi_ui.cc index 06c9428ad7..b9271ccd49 100644 --- a/libs/ardour/midi_ui.cc +++ b/libs/ardour/midi_ui.cc @@ -130,9 +130,9 @@ MidiControlUI::reset_ports () { clear_ports (); - MIDI::Manager::PortList plist = MIDI::Manager::instance()->get_midi_ports (); + boost::shared_ptr plist = MIDI::Manager::instance()->get_midi_ports (); - for (MIDI::Manager::PortList::iterator i = plist.begin(); i != plist.end(); ++i) { + for (MIDI::Manager::PortList::const_iterator i = plist->begin(); i != plist->end(); ++i) { int fd; if ((fd = (*i)->selectable ()) >= 0) { diff --git a/libs/ardour/rc_configuration.cc b/libs/ardour/rc_configuration.cc index 1dc1ea636b..c4417b376e 100644 --- a/libs/ardour/rc_configuration.cc +++ b/libs/ardour/rc_configuration.cc @@ -212,9 +212,9 @@ RCConfiguration::get_state () MIDI::Manager* mm = MIDI::Manager::instance(); if (mm) { - const MIDI::Manager::PortList& ports = mm->get_midi_ports(); + boost::shared_ptr ports = mm->get_midi_ports(); - for (MIDI::Manager::PortList::const_iterator i = ports.begin(); i != ports.end(); ++i) { + for (MIDI::Manager::PortList::const_iterator i = ports->begin(); i != ports->end(); ++i) { root->add_child_nocopy((*i)->get_state()); } } diff --git a/libs/midi++2/manager.cc b/libs/midi++2/manager.cc index d4b9b00715..8aa89c7a99 100644 --- a/libs/midi++2/manager.cc +++ b/libs/midi++2/manager.cc @@ -35,7 +35,8 @@ using namespace PBD; Manager *Manager::theManager = 0; -Manager::Manager (jack_client_t* jack) +Manager::Manager (jack_client_t* jack) + : _ports (new PortList) { _mmc = new MachineControl (this, jack); @@ -52,7 +53,9 @@ Manager::~Manager () delete _mmc; /* This will delete our MTC etc. ports */ - for (PortList::iterator p = _ports.begin(); p != _ports.end(); ++p) { + + boost::shared_ptr pr = _ports.reader (); + for (PortList::iterator p = pr->begin(); p != pr->end(); ++p) { delete *p; } @@ -64,7 +67,9 @@ Manager::~Manager () Port * Manager::add_port (Port* p) { - _ports.push_back (p); + RCUWriter writer (_ports); + boost::shared_ptr pw = writer.get_copy (); + pw->push_back (p); PortsChanged (); /* EMIT SIGNAL */ @@ -74,7 +79,9 @@ Manager::add_port (Port* p) void Manager::cycle_start (pframes_t nframes) { - for (PortList::iterator p = _ports.begin(); p != _ports.end(); ++p) { + boost::shared_ptr pr = _ports.reader (); + + for (PortList::iterator p = pr->begin(); p != pr->end(); ++p) { (*p)->cycle_start (nframes); } } @@ -82,7 +89,9 @@ Manager::cycle_start (pframes_t nframes) void Manager::cycle_end() { - for (PortList::iterator p = _ports.begin(); p != _ports.end(); ++p) { + boost::shared_ptr pr = _ports.reader (); + + for (PortList::iterator p = pr->begin(); p != pr->end(); ++p) { (*p)->cycle_end (); } } @@ -91,7 +100,9 @@ Manager::cycle_end() void Manager::reestablish (jack_client_t* jack) { - for (PortList::const_iterator p = _ports.begin(); p != _ports.end(); ++p) { + boost::shared_ptr pr = _ports.reader (); + + for (PortList::const_iterator p = pr->begin(); p != pr->end(); ++p) { (*p)->reestablish (jack); } } @@ -100,7 +111,9 @@ Manager::reestablish (jack_client_t* jack) void Manager::reconnect () { - for (PortList::const_iterator p = _ports.begin(); p != _ports.end(); ++p) { + boost::shared_ptr pr = _ports.reader (); + + for (PortList::const_iterator p = pr->begin(); p != pr->end(); ++p) { (*p)->reconnect (); } } @@ -108,12 +121,14 @@ Manager::reconnect () Port* Manager::port (string const & n) { - PortList::const_iterator p = _ports.begin(); - while (p != _ports.end() && (*p)->name() != n) { + boost::shared_ptr pr = _ports.reader (); + + PortList::const_iterator p = pr->begin(); + while (p != pr->end() && (*p)->name() != n) { ++p; } - if (p == _ports.end()) { + if (p == pr->end()) { return 0; } @@ -130,8 +145,10 @@ Manager::create (jack_client_t* jack) void Manager::set_port_states (list s) { + boost::shared_ptr pr = _ports.reader (); + for (list::iterator i = s.begin(); i != s.end(); ++i) { - for (PortList::const_iterator j = _ports.begin(); j != _ports.end(); ++j) { + for (PortList::const_iterator j = pr->begin(); j != pr->end(); ++j) { (*j)->set_state (**i); } } diff --git a/libs/midi++2/midi++/manager.h b/libs/midi++2/midi++/manager.h index dec9d0d9f1..75b0cb4864 100644 --- a/libs/midi++2/midi++/manager.h +++ b/libs/midi++2/midi++/manager.h @@ -24,6 +24,8 @@ #include +#include "pbd/rcu.h" + #include "midi++/types.h" #include "midi++/port.h" @@ -64,7 +66,7 @@ class Manager { typedef std::list PortList; - const PortList& get_midi_ports() const { return _ports; } + boost::shared_ptr get_midi_ports() const { return _ports.reader (); } static void create (jack_client_t* jack); @@ -90,8 +92,8 @@ class Manager { MIDI::Port* _midi_output_port; MIDI::Port* _midi_clock_input_port; MIDI::Port* _midi_clock_output_port; - - std::list _ports; + + SerializedRCUManager _ports; }; } // namespace MIDI -- cgit v1.2.3