summaryrefslogtreecommitdiffstats
path: root/src/libs/engine/NodeBase.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2008-05-14 23:31:15 +0000
committerDavid Robillard <d@drobilla.net>2008-05-14 23:31:15 +0000
commiteb10d32d8b59f2158ba64ba55e310ba0f5f24170 (patch)
treed67944c6ada3369ba988cee4bd86ca24ee9de703 /src/libs/engine/NodeBase.cpp
parent5fc6f5df54a2650c4a53f04ee38cfebec0a515e1 (diff)
downloadingen-eb10d32d8b59f2158ba64ba55e310ba0f5f24170.tar.gz
ingen-eb10d32d8b59f2158ba64ba55e310ba0f5f24170.tar.bz2
ingen-eb10d32d8b59f2158ba64ba55e310ba0f5f24170.zip
Fix clear patch command (ticket #18).
Potential destruction race/leak fixes. More thorough thread assertions on graph object methods. git-svn-id: http://svn.drobilla.net/lad/ingen@1207 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/libs/engine/NodeBase.cpp')
-rw-r--r--src/libs/engine/NodeBase.cpp44
1 files changed, 30 insertions, 14 deletions
diff --git a/src/libs/engine/NodeBase.cpp b/src/libs/engine/NodeBase.cpp
index 6fe320e8..54217aae 100644
--- a/src/libs/engine/NodeBase.cpp
+++ b/src/libs/engine/NodeBase.cpp
@@ -27,6 +27,7 @@
#include "PortImpl.hpp"
#include "PatchImpl.hpp"
#include "ObjectStore.hpp"
+#include "ThreadManager.hpp"
using namespace std;
@@ -34,19 +35,19 @@ namespace Ingen {
NodeBase::NodeBase(PluginImpl* plugin, const string& name, bool polyphonic, PatchImpl* parent, SampleRate srate, size_t buffer_size)
-: NodeImpl(parent, name, polyphonic),
- _plugin(plugin),
- _polyphony((polyphonic && parent) ? parent->internal_polyphony() : 1),
- _srate(srate),
- _buffer_size(buffer_size),
- _activated(false),
- _traversed(false),
- _input_ready(1),
- _process_lock(0),
- _n_inputs_ready(0),
- _ports(NULL),
- _providers(new Raul::List<NodeImpl*>()),
- _dependants(new Raul::List<NodeImpl*>())
+ : NodeImpl(parent, name, polyphonic)
+ , _plugin(plugin)
+ , _polyphony((polyphonic && parent) ? parent->internal_polyphony() : 1)
+ , _srate(srate)
+ , _buffer_size(buffer_size)
+ , _activated(false)
+ , _traversed(false)
+ , _input_ready(1)
+ , _process_lock(0)
+ , _n_inputs_ready(0)
+ , _ports(NULL)
+ , _providers(new Raul::List<NodeImpl*>())
+ , _dependants(new Raul::List<NodeImpl*>())
{
assert(_plugin);
assert(_polyphony > 0);
@@ -56,7 +57,8 @@ NodeBase::NodeBase(PluginImpl* plugin, const string& name, bool polyphonic, Patc
NodeBase::~NodeBase()
{
- assert(!_activated);
+ if (_activated)
+ deactivate();
delete _providers;
delete _dependants;
@@ -80,6 +82,7 @@ NodeBase::plugin() const
void
NodeBase::activate()
{
+ assert(ThreadManager::current_thread_id() == THREAD_PRE_PROCESS);
assert(!_activated);
_activated = true;
}
@@ -88,6 +91,7 @@ NodeBase::activate()
void
NodeBase::deactivate()
{
+ assert(ThreadManager::current_thread_id() == THREAD_POST_PROCESS);
assert(_activated);
_activated = false;
}
@@ -96,6 +100,8 @@ NodeBase::deactivate()
bool
NodeBase::prepare_poly(uint32_t poly)
{
+ assert(ThreadManager::current_thread_id() == THREAD_PRE_PROCESS);
+
if (!_polyphonic)
return true;
@@ -110,6 +116,8 @@ NodeBase::prepare_poly(uint32_t poly)
bool
NodeBase::apply_poly(Raul::Maid& maid, uint32_t poly)
{
+ assert(ThreadManager::current_thread_id() == THREAD_PROCESS);
+
if (!_polyphonic)
return true;
@@ -124,6 +132,8 @@ NodeBase::apply_poly(Raul::Maid& maid, uint32_t poly)
void
NodeBase::set_buffer_size(size_t size)
{
+ assert(ThreadManager::current_thread_id() == THREAD_PROCESS);
+
_buffer_size = size;
if (_ports)
@@ -159,6 +169,7 @@ NodeBase::process_unlock()
void
NodeBase::wait_for_input(size_t num_providers)
{
+ assert(ThreadManager::current_thread_id() == THREAD_PROCESS);
assert(_process_lock.get() == 1);
while ((unsigned)_n_inputs_ready.get() < num_providers) {
@@ -175,6 +186,7 @@ NodeBase::wait_for_input(size_t num_providers)
void
NodeBase::signal_input_ready()
{
+ assert(ThreadManager::current_thread_id() == THREAD_PROCESS);
//cout << path() << " SIGNAL" << endl;
++_n_inputs_ready;
_input_ready.post();
@@ -186,6 +198,8 @@ NodeBase::signal_input_ready()
void
NodeBase::pre_process(ProcessContext& context)
{
+ assert(ThreadManager::current_thread_id() == THREAD_PROCESS);
+
// Mix down any ports with multiple inputs
if (_ports)
for (size_t i=0; i < _ports->size(); ++i)
@@ -198,6 +212,8 @@ NodeBase::pre_process(ProcessContext& context)
void
NodeBase::post_process(ProcessContext& context)
{
+ assert(ThreadManager::current_thread_id() == THREAD_PROCESS);
+
/* Write output ports */
if (_ports)
for (size_t i=0; i < _ports->size(); ++i)