summaryrefslogtreecommitdiffstats
path: root/src/server/Task.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2018-03-29 10:56:18 +0200
committerDavid Robillard <d@drobilla.net>2018-03-29 10:56:18 +0200
commit7a5e694c3ffed12532ee2b97f99c4b56dbba4d02 (patch)
tree483f736f406a40093f1f65444d76f12b89caaf7e /src/server/Task.cpp
parentc9863ba79edbac7ae78ad0e374a2988c816ad31a (diff)
downloadingen-7a5e694c3ffed12532ee2b97f99c4b56dbba4d02.tar.gz
ingen-7a5e694c3ffed12532ee2b97f99c4b56dbba4d02.tar.bz2
ingen-7a5e694c3ffed12532ee2b97f99c4b56dbba4d02.zip
WIP: more variant task
Diffstat (limited to 'src/server/Task.cpp')
-rw-r--r--src/server/Task.cpp87
1 files changed, 53 insertions, 34 deletions
diff --git a/src/server/Task.cpp b/src/server/Task.cpp
index 0978e15d..497f7895 100644
--- a/src/server/Task.cpp
+++ b/src/server/Task.cpp
@@ -33,9 +33,9 @@ get_task(ParTask& task, RunContext& context)
while (true) {
// Push done end index as forward as possible
- // while (task.done_end < task.children.size() && task.children[task.done_end]->done()) {
- // ++task.done_end;
- // }
+ while (task.done_end < task.children.size() && task.children[task.done_end].done()) {
+ ++task.done_end;
+ }
if (task.done_end >= task.children.size()) {
return nullptr; // All child tasks are finished
@@ -63,8 +63,8 @@ struct Runner
}
void operator()(SeqTask& task) {
- for (const auto& child : task.children) {
- run(*child, context);
+ for (auto& child : task.children) {
+ run(child, context);
}
}
@@ -104,47 +104,61 @@ steal(ParTask& task, RunContext& context)
{
const unsigned i = task.next++;
if (i < task.children.size()) {
- return task.children[i].get();
+ return &task.children[i];
}
return nullptr;
}
-std::unique_ptr<Task>
-simplify(std::unique_ptr<Task>&& task)
+static bool empty(Task& task)
{
-#if 0
- if (boost::get<SingleTask>(task.get())) {
- return std::move(task);
+ if (SeqTask* seq = boost::get<SeqTask>(&task)) {
+ return seq->children.empty();
+ } else if (ParTask* par = boost::get<ParTask>(&task)) {
+ return par->children.empty();
}
- std::unique_ptr<Task> ret = std::unique_ptr<Task>(new Task(task->mode()));
- for (auto&& c : task->_children) {
+ return false;
+}
+
+template<typename T>
+static Task
+simplify(T&& task)
+{
+ typename std::remove_reference<T>::type ret;
+ for (auto&& c : task.children) {
auto child = simplify(std::move(c));
- if (!child->empty()) {
- if (child->mode() == task->mode()) {
- // Merge child into parent
- for (auto&& grandchild : child->_children) {
- ret->append(std::move(grandchild));
+ if (!empty(child)) {
+ if (T* merge_child = boost::get<T>(&child)) {
+ // Child has same type, merge into parent
+ for (auto&& grandchild : merge_child->children) {
+ ret.children.emplace_back(std::move(grandchild));
}
} else {
- // Add child task
- ret->append(std::move(child));
+ // Append child task
+ ret.children.emplace_back(std::move(child));
}
}
}
- if (ret->_children.size() == 1) {
- return std::move(ret->_children.front());
+ return ret.children.size() == 1 ? std::move(ret.children.front())
+ : Task(std::move(ret));
+}
+
+Task
+simplify(Task&& task)
+{
+ if (SeqTask* seq = boost::get<SeqTask>(&task)) {
+ return simplify<SeqTask>(std::move(*seq));
+ } else if (ParTask* par = boost::get<ParTask>(&task)) {
+ return simplify<ParTask>(std::move(*par));
}
- return ret;
-#endif
- return nullptr;
+
+ return std::move(task);
}
-#if 0
void
-Task::dump(std::function<void (const std::string&)> sink, unsigned indent, bool first) const
+dump(Task& task, std::function<void (const std::string&)> sink, unsigned indent, bool first)
{
if (!first) {
sink("\n");
@@ -153,17 +167,22 @@ Task::dump(std::function<void (const std::string&)> sink, unsigned indent, bool
}
}
- if (_mode == Mode::SINGLE) {
- sink(_block->path());
- } else {
- sink(((_mode == Mode::SEQUENTIAL) ? "(seq " : "(par "));
- for (size_t i = 0; i < _children.size(); ++i) {
- _children[i]->dump(sink, indent + 5, i == 0);
+ if (SingleTask* single = boost::get<SingleTask>(&task)) {
+ sink(single->block->path());
+ } else if (SeqTask* seq = boost::get<SeqTask>(&task)) {
+ sink("(seq ");
+ for (size_t i = 0; i < seq->children.size(); ++i) {
+ dump(seq->children[i], sink, indent + 5, i == 0);
+ }
+ sink(")");
+ } else if (ParTask* par = boost::get<ParTask>(&task)) {
+ sink("(par ");
+ for (size_t i = 0; i < par->children.size(); ++i) {
+ dump(par->children[i], sink, indent + 5, i == 0);
}
sink(")");
}
}
-#endif
} // namespace Server
} // namespace Ingen