X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fgraphnode.cc;h=47cabfbae09ae7c4152bc39bc3d4709b5233efb3;hb=5694d877aaf4e69c90f76aa592e110289cbe81c6;hp=8a2deed80817cc15cccb60316ccd69df86b69ea1;hpb=a473d630eb165272992e90f8d854b1d66ec0be63;p=ardour.git diff --git a/libs/ardour/graphnode.cc b/libs/ardour/graphnode.cc index 8a2deed808..47cabfbae0 100644 --- a/libs/ardour/graphnode.cc +++ b/libs/ardour/graphnode.cc @@ -24,8 +24,8 @@ using namespace ARDOUR; -GraphNode::GraphNode (graph_ptr_t graph) - : _graph(graph) +GraphNode::GraphNode (boost::shared_ptr graph) + : _graph(graph) { } @@ -36,35 +36,45 @@ GraphNode::~GraphNode() void GraphNode::prep (int chain) { - _refcount = _init_refcount[chain]; + /* This is the number of nodes that directly feed us */ + _refcount = _init_refcount[chain]; } +/** Called by another node to tell us that one of the nodes that feed us + * has been processed. + */ void GraphNode::dec_ref() { - if (g_atomic_int_dec_and_test (&_refcount)) - _graph->trigger (this); + if (g_atomic_int_dec_and_test (&_refcount)) { + /* All the nodes that feed us are done, so we can queue this node + * for processing. + */ + _graph->trigger (this); + } } void GraphNode::finish (int chain) { - node_set_t::iterator i; - bool feeds_somebody = false; + node_set_t::iterator i; + bool feeds_somebody = false; - for (i=_activation_set[chain].begin(); i!=_activation_set[chain].end(); i++) { - (*i)->dec_ref(); - feeds_somebody = true; - } + /* Tell the nodes that we feed that we've finished */ + for (i=_activation_set[chain].begin(); i!=_activation_set[chain].end(); i++) { + (*i)->dec_ref(); + feeds_somebody = true; + } - if (!feeds_somebody) { - _graph->dec_ref(); - } + if (!feeds_somebody) { + /* This node does not feed anybody, so decrement the graph's finished count */ + _graph->dec_ref(); + } } void GraphNode::process() { - _graph->process_one_route (dynamic_cast(this)); + _graph->process_one_route (dynamic_cast(this)); }