summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorCarl Hetherington <carl@carlh.net>2011-09-26 20:35:09 +0000
committerCarl Hetherington <carl@carlh.net>2011-09-26 20:35:09 +0000
commitd6112f121313f6db8353e32c1339f84cd1e59608 (patch)
tree58743c85a8685f13c5a3ef3ab89f138d04ae4fdf /libs
parente5a9ea3ed9c7c3bcc078c12891526df9a61f54f9 (diff)
Use RCU for MIDI Manager's port list.
git-svn-id: svn://localhost/ardour2/branches/3.0@10128 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs')
-rw-r--r--libs/ardour/midi_ui.cc4
-rw-r--r--libs/ardour/rc_configuration.cc4
-rw-r--r--libs/midi++2/manager.cc39
-rw-r--r--libs/midi++2/midi++/manager.h8
4 files changed, 37 insertions, 18 deletions
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<const MIDI::Manager::PortList> 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<const MIDI::Manager::PortList> 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<PortList> 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<PortList> writer (_ports);
+ boost::shared_ptr<PortList> 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<PortList> 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<PortList> 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<PortList> 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<PortList> 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<PortList> 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<XMLNode*> s)
{
+ boost::shared_ptr<PortList> pr = _ports.reader ();
+
for (list<XMLNode*>::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 <string>
+#include "pbd/rcu.h"
+
#include "midi++/types.h"
#include "midi++/port.h"
@@ -64,7 +66,7 @@ class Manager {
typedef std::list<Port *> PortList;
- const PortList& get_midi_ports() const { return _ports; }
+ boost::shared_ptr<const PortList> 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<Port*> _ports;
+
+ SerializedRCUManager<PortList> _ports;
};
} // namespace MIDI