summaryrefslogtreecommitdiffstats
path: root/src/server/CompiledGraph.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/CompiledGraph.cpp')
-rw-r--r--src/server/CompiledGraph.cpp27
1 files changed, 16 insertions, 11 deletions
diff --git a/src/server/CompiledGraph.cpp b/src/server/CompiledGraph.cpp
index 32302174..fbc7ab26 100644
--- a/src/server/CompiledGraph.cpp
+++ b/src/server/CompiledGraph.cpp
@@ -17,6 +17,8 @@
#include <algorithm>
#include <unordered_set>
+#include <boost/variant/get.hpp>
+
#include "ingen/ColorContext.hpp"
#include "ingen/Configuration.hpp"
#include "ingen/Log.hpp"
@@ -111,7 +113,7 @@ check_feedback(const BlockImpl* root, BlockImpl* node)
}
static void
-compile_block(BlockImpl* n, Task& task, BlockSet& k)
+compile_block(BlockImpl* n, ParTask& task, BlockSet& k)
{
switch (n->get_mark()) {
case BlockImpl::Mark::UNVISITED: {
@@ -119,7 +121,7 @@ compile_block(BlockImpl* n, Task& task, BlockSet& k)
if (has_provider_with_fan_out(n)) {
// Provider shared by other dependants, enqueue providers for later
// Prepends n to current task: (... n ...)
- task.emplace_front(n);
+ task.emplace_front(SingleTask{n});
for (auto p : n->providers()) {
check_feedback(n, p);
if (num_unvisited_dependants(p) == 0) {
@@ -129,13 +131,15 @@ compile_block(BlockImpl* n, Task& task, BlockSet& k)
} else {
// All providers have only this dependant
// Runs node after parallel providers: (... (seq (par p...) n) ...)
- task.emplace_front(Task::Mode::SEQUENTIAL);
- task.front().emplace_front(n);
+ SeqTask seq;
+ seq.emplace_front(SingleTask{n});
- task.front().emplace_front(Task::Mode::PARALLEL);
+ ParTask par;
for (auto p : n->providers()) {
- compile_block(p, task.front().front(), k);
+ compile_block(p, par, k);
}
+ seq.emplace_front(std::move(par));
+ task.emplace_front(std::move(seq));
}
break;
}
@@ -149,7 +153,7 @@ compile_block(BlockImpl* n, Task& task, BlockSet& k)
}
CompiledGraph::CompiledGraph(GraphImpl& graph)
- : _master(std::unique_ptr<Task>(new Task(Task::Mode::SEQUENTIAL)))
+ : _master(std::unique_ptr<Task>(new Task(SeqTask())))
{
ThreadManager::assert_thread(THREAD_PRE_PROCESS);
@@ -169,16 +173,17 @@ CompiledGraph::CompiledGraph(GraphImpl& graph)
while (!blocks.empty()) {
BlockSet predecessors;
- _master->emplace_front(Task::Mode::PARALLEL);
+ ParTask par;
for (auto b : blocks) {
assert(num_unvisited_dependants(b) == 0);
- compile_block(b, _master->front(), predecessors);
+ compile_block(b, par, predecessors);
}
+ boost::get<SeqTask>(_master.get())->emplace_front(std::move(par));
blocks = std::move(predecessors);
}
- _master = Task::simplify(std::move(_master));
+ _master = simplify(std::move(_master));
}
MPtr<CompiledGraph> compile(Raul::Maid& maid, GraphImpl& graph)
@@ -190,7 +195,7 @@ MPtr<CompiledGraph> compile(Raul::Maid& maid, GraphImpl& graph)
Log& log = graph.engine().log();
auto sink = [&log](const std::string& s) { log.trace(s); };
sink(graph.path() + " =>\n ");
- result->master().dump(sink, 2, true);
+ //result->master().dump(sink, 2, true);
sink("\n");
}