X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fgraphnode.cc;h=c8923a043df84f441d2d0f1e316bebb36d84665d;hb=91ab5e31751105d59386aab6a6e16ac5582904dc;hp=7c0bc936d7d3759993cfce41e5e28173ec8cf96f;hpb=5ce3409e5debaf9d42749cb69c544a09c550f43a;p=ardour.git diff --git a/libs/ardour/graphnode.cc b/libs/ardour/graphnode.cc index 7c0bc936d7..c8923a043d 100644 --- a/libs/ardour/graphnode.cc +++ b/libs/ardour/graphnode.cc @@ -24,9 +24,9 @@ using namespace ARDOUR; -GraphNode::GraphNode (graph_ptr_t graph) +GraphNode::GraphNode (boost::shared_ptr graph) : _graph(graph) -{ +{ } GraphNode::~GraphNode() @@ -36,14 +36,22 @@ GraphNode::~GraphNode() void GraphNode::prep (int 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)) + 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 @@ -52,12 +60,14 @@ GraphNode::finish (int chain) node_set_t::iterator i; bool feeds_somebody = false; + /* 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) { + /* This node does not feed anybody, so decrement the graph's finished count */ _graph->dec_ref(); } }