summaryrefslogtreecommitdiffstats
path: root/src/libs/engine/NodeBase.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2007-08-09 05:16:00 +0000
committerDavid Robillard <d@drobilla.net>2007-08-09 05:16:00 +0000
commit9b7a2af07fd1f5df3e517021d676805eb20bc74f (patch)
tree3a75d0096fea9f013f7da24cd9c41dcea89fb4de /src/libs/engine/NodeBase.cpp
parentfccb1edce5dda41bdfef12340a5d5b95b86a1389 (diff)
downloadingen-9b7a2af07fd1f5df3e517021d676805eb20bc74f.tar.gz
ingen-9b7a2af07fd1f5df3e517021d676805eb20bc74f.tar.bz2
ingen-9b7a2af07fd1f5df3e517021d676805eb20bc74f.zip
Realtime safe parallel graph execution, e.g. run with ingen -e -p 3 for 3 concurrent audio threads.
git-svn-id: http://svn.drobilla.net/lad/ingen@689 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/libs/engine/NodeBase.cpp')
-rw-r--r--src/libs/engine/NodeBase.cpp55
1 files changed, 54 insertions, 1 deletions
diff --git a/src/libs/engine/NodeBase.cpp b/src/libs/engine/NodeBase.cpp
index b7066a0c..b61783b3 100644
--- a/src/libs/engine/NodeBase.cpp
+++ b/src/libs/engine/NodeBase.cpp
@@ -41,6 +41,9 @@ NodeBase::NodeBase(const Plugin* plugin, const string& name, uint32_t poly, Patc
_buffer_size(buffer_size),
_activated(false),
_traversed(false),
+ _input_ready(1),
+ _process_lock(0),
+ _n_inputs_ready(0),
_ports(NULL),
_providers(new Raul::List<Node*>()),
_dependants(new Raul::List<Node*>())
@@ -88,6 +91,55 @@ NodeBase::set_buffer_size(size_t size)
for (size_t i=0; i < _ports->size(); ++i)
_ports->at(i)->set_buffer_size(size);
}
+
+
+void
+NodeBase::reset_input_ready()
+{
+ //cout << path() << " RESET" << endl;
+ _n_inputs_ready = 0;
+ _process_lock = 0;
+ _input_ready.reset(0);
+}
+
+
+bool
+NodeBase::process_lock()
+{
+ return _process_lock.compare_and_exchange(0, 1);
+}
+
+
+void
+NodeBase::process_unlock()
+{
+ _process_lock = 0;
+}
+
+
+void
+NodeBase::wait_for_input(size_t num_providers)
+{
+ assert(_process_lock.get() == 1);
+
+ while ((unsigned)_n_inputs_ready.get() < num_providers) {
+ //cout << path() << " WAITING " << _n_inputs_ready.get() << endl;
+ _input_ready.wait();
+ //cout << path() << " CAUGHT SIGNAL" << endl;
+ //++_n_inputs_ready;
+ }
+
+ //cout << path() << " READY" << endl;
+}
+
+
+void
+NodeBase::signal_input_ready()
+{
+ //cout << path() << " SIGNAL" << endl;
+ ++_n_inputs_ready;
+ _input_ready.post();
+}
/** Prepare to run a cycle (in the audio thread)
@@ -108,7 +160,8 @@ void
NodeBase::post_process(SampleCount nframes, FrameTime start, FrameTime end)
{
assert(_activated);
- // Prepare any output ports for reading (MIDI)
+
+ /* Write output ports */
for (size_t i=0; i < _ports->size(); ++i)
_ports->at(i)->post_process(nframes, start, end);
}