/* This file is part of Ingen. Copyright 2007-2012 David Robillard Ingen is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or any later version. Ingen is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for details. You should have received a copy of the GNU Affero General Public License along with Ingen. If not, see . */ #include "ProcessSlave.hpp" #include "NodeImpl.hpp" #include "CompiledPatch.hpp" using namespace std; namespace Ingen { namespace Server { uint32_t ProcessSlave::_next_id = 0; void ProcessSlave::_whipped() { assert(_compiled_patch); CompiledPatch* const cp = _compiled_patch; /* Iterate over all nodes attempting to run immediately or block then run, * until we've been through the entire array without getting a lock, * and thus are finished this cycle. */ size_t num_finished = 0; // Number of consecutive finished nodes hit while (_state == STATE_RUNNING) { CompiledNode& n = (*cp)[_index]; if (n.node()->process_lock()) { n.node()->wait_for_input(*_context, n.n_providers()); n.node()->process(*_context); /* Signal dependants their input is ready */ for (size_t i=0; i < n.dependants().size(); ++i) n.dependants()[i]->signal_input_ready(*_context); num_finished = 1; } else { ++num_finished; } _index = (_index + 1) % cp->size(); if (num_finished >= cp->size()) break; } _index = 0; _compiled_patch = NULL; _state = STATE_FINISHED; } } // namespace Server } // namespace Ingen