/*
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 .
*/
#ifndef INGEN_ENGINE_PROCESSSLAVE_HPP
#define INGEN_ENGINE_PROCESSSLAVE_HPP
#include
#include "raul/Array.hpp"
#include "raul/AtomicInt.hpp"
#include "raul/Slave.hpp"
#include "Driver.hpp"
#include "Engine.hpp"
#include "ProcessContext.hpp"
#include "ThreadManager.hpp"
namespace Ingen {
namespace Server {
class NodeImpl;
class CompiledPatch;
class ProcessSlave : protected Raul::Slave {
public:
ProcessSlave(Engine& engine, bool realtime)
: _engine(engine)
, _id(_next_id++)
, _index(0)
, _state(STATE_FINISHED)
, _compiled_patch(NULL)
, _context(NULL)
{
std::stringstream ss;
ss << "Process Slave ";
ss << _id;
set_name(ss.str());
start();
if (realtime)
set_scheduling(SCHED_FIFO, 40);
set_context(THREAD_PROCESS);
}
~ProcessSlave() {
stop();
}
inline void whip(CompiledPatch* compiled_patch,
uint32_t start_index,
ProcessContext& context)
{
assert(_state == STATE_FINISHED);
_index = start_index;
_state = STATE_RUNNING;
_compiled_patch = compiled_patch;
_context = &context;
Raul::Slave::whip();
}
inline void finish() {
while (_state.get() != STATE_FINISHED)
_state.compare_and_exchange(STATE_RUNNING, STATE_FINISH_SIGNALLED);
}
inline uint32_t id() const { return _id; }
inline const ProcessContext& context() const { return _engine.driver()->context(); }
inline ProcessContext& context() { return _engine.driver()->context(); }
private:
void _whipped();
static uint32_t _next_id;
static const int STATE_RUNNING = 0;
static const int STATE_FINISH_SIGNALLED = 1;
static const int STATE_FINISHED = 2;
Engine& _engine;
uint32_t _id;
uint32_t _index;
Raul::AtomicInt _state;
CompiledPatch* _compiled_patch;
ProcessContext* _context;
};
} // namespace Server
} // namespace Ingen
#endif // INGEN_ENGINE_PROCESSSLAVE_HPP