diff options
author | David Robillard <d@drobilla.net> | 2016-09-12 22:37:22 +0800 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2016-10-01 12:25:43 -0400 |
commit | fed7aaf0901e1b26dcc2bbb222f67b11f6b9d291 (patch) | |
tree | 8ae07a75439481109da586b211c4da85fca8730b /src/server/RunContext.hpp | |
parent | 11b55676a510171a56975743fd752ccbcc170622 (diff) | |
download | ingen-fed7aaf0901e1b26dcc2bbb222f67b11f6b9d291.tar.gz ingen-fed7aaf0901e1b26dcc2bbb222f67b11f6b9d291.tar.bz2 ingen-fed7aaf0901e1b26dcc2bbb222f67b11f6b9d291.zip |
Add parallel graph execution
Diffstat (limited to 'src/server/RunContext.hpp')
-rw-r--r-- | src/server/RunContext.hpp | 40 |
1 files changed, 30 insertions, 10 deletions
diff --git a/src/server/RunContext.hpp b/src/server/RunContext.hpp index 803d7829..803e0c3b 100644 --- a/src/server/RunContext.hpp +++ b/src/server/RunContext.hpp @@ -17,6 +17,8 @@ #ifndef INGEN_ENGINE_RUNCONTEXT_HPP #define INGEN_ENGINE_RUNCONTEXT_HPP +#include <thread> + #include "ingen/Atom.hpp" #include "ingen/World.hpp" #include "raul/RingBuffer.hpp" @@ -28,6 +30,7 @@ namespace Server { class Engine; class PortImpl; +class Task; /** Graph execution context. * @@ -44,8 +47,19 @@ class PortImpl; class RunContext { public: - RunContext(Engine& engine); - RunContext(const RunContext& copy); + /** Create a new run context. + * + * @param threaded If true, then this context is a worker which will launch + * a thread and execute tasks as they become available. + */ + RunContext(Engine& engine, unsigned id, bool threaded); + + /** Create a sub-context of `parent`. + * + * This is used to subdivide process cycles, the sub-context is + * lightweight and only serves to pass different time attributes. + */ + RunContext(const RunContext& parent); virtual ~RunContext(); @@ -79,18 +93,20 @@ public: _nframes = nframes; } - inline void locate(const RunContext& other) { - _start = other._start; - _end = other._end; - _nframes = other._nframes; - } - inline void slice(SampleCount offset, SampleCount nframes) { _offset = offset; _nframes = nframes; } + inline void set_task(Task* task) { + _task = task; + } + + void set_priority(int priority); + inline Engine& engine() const { return _engine; } + inline Task* task() const { return _task; } + inline unsigned id() const { return _id; } inline FrameTime start() const { return _start; } inline FrameTime time() const { return _start + _offset; } inline FrameTime end() const { return _end; } @@ -101,9 +117,13 @@ public: protected: const RunContext& operator=(const RunContext& copy) = delete; - Engine& _engine; ///< Engine we're running in + void run(); - Raul::RingBuffer* _event_sink; ///< Port updates from process context + Engine& _engine; ///< Engine we're running in + Raul::RingBuffer* _event_sink; ///< Port updates from process context + Task* _task; ///< Currently executing task + std::thread* _thread; ///< Thread (NULL for main run context) + unsigned _id; ///< Context ID FrameTime _start; ///< Start frame of this cycle, timeline relative FrameTime _end; ///< End frame of this cycle, timeline relative |