summaryrefslogtreecommitdiffstats
path: root/include/framework/scheduling/Task.h
diff options
context:
space:
mode:
authorDouglas Rumbaugh <dbr4@psu.edu>2023-10-20 17:00:42 -0400
committerDouglas Rumbaugh <dbr4@psu.edu>2023-10-20 17:00:42 -0400
commit7ecfb22c32b7986ed1a2439c1abbeed298e4153a (patch)
treed7207b5755ce987068620b71f9b4af9a52982c0d /include/framework/scheduling/Task.h
parent1a47cbd7978dcad7ed0b2f2af3f933137eedbfa3 (diff)
downloaddynamic-extension-7ecfb22c32b7986ed1a2439c1abbeed298e4153a.tar.gz
Initial pass w/ new scheduler setup
currently there's a race condition of some type to sort out.
Diffstat (limited to 'include/framework/scheduling/Task.h')
-rw-r--r--include/framework/scheduling/Task.h112
1 files changed, 27 insertions, 85 deletions
diff --git a/include/framework/scheduling/Task.h b/include/framework/scheduling/Task.h
index 3c1b158..518159d 100644
--- a/include/framework/scheduling/Task.h
+++ b/include/framework/scheduling/Task.h
@@ -5,111 +5,53 @@
#include <variant>
#include <future>
+#include <functional>
#include "framework/util/Configuration.h"
namespace de {
-enum class TaskType {
- MERGE,
- QUERY
+struct MergeArgs {
+ void *version;
+ void *buffer;
+ std::vector<MergeTask> merges;
+ std::promise<bool> result;
};
-struct TaskDependency {
- std::promise<void> prom;
- std::future<void> fut;
+template <typename R>
+struct QueryArgs {
+ void *version;
+ void *buffer;
+ std::promise<std::vector<R>> result_set;
+ void *query_parms;
};
-struct MergeTask {
- level_index m_source_level;
- level_index m_target_level;
- size_t m_timestamp;
- size_t m_size;
- TaskType m_type;
- std::unique_ptr<TaskDependency> m_dep;
-
- MergeTask() = default;
-
- MergeTask(level_index source, level_index target, size_t size, size_t timestamp)
- : m_source_level(source)
- , m_target_level(target)
- , m_timestamp(timestamp)
- , m_size(size)
- , m_type(TaskType::MERGE)
- , m_dep(std::make_unique<TaskDependency>()){}
-
+typedef std::function<void(void*)> Job;
- MergeTask(MergeTask &t)
- : m_source_level(t.m_source_level)
- , m_target_level(t.m_target_level)
- , m_timestamp(t.m_timestamp)
- , m_size(t.m_size)
- , m_type(TaskType::MERGE)
- , m_dep(std::move(t.m_dep))
+struct Task {
+ Task(size_t size, size_t ts, Job job, void *args)
+ : m_job(job)
+ , m_size(size)
+ , m_timestamp(ts)
+ , m_args(args)
{}
-
- TaskType get_type() const {
- return m_type;
- }
-
- void make_dependent_on(MergeTask &task) {
- m_dep->fut = task.m_dep->prom.get_future();
- }
-
- void make_dependent_on(TaskDependency *dep) {
- m_dep->fut = dep->prom.get_future();
- }
-
- friend bool operator<(const MergeTask &self, const MergeTask &other) {
- return self.m_timestamp < other.m_timestamp;
- }
-
- friend bool operator>(const MergeTask &self, const MergeTask &other) {
- return self.m_timestamp > other.m_timestamp;
- }
-
-};
-
-struct QueryTask {
- size_t m_timestamp;
+ Job m_job;
size_t m_size;
- TaskType m_type;
- std::unique_ptr<TaskDependency> m_dep;
-
- QueryTask(QueryTask &t)
- : m_timestamp(t.m_timestamp)
- , m_size(t.m_size)
- , m_type(t.m_type)
- , m_dep(std::move(t.m_dep))
- {}
-
- TaskType get_type() const {
- return m_type;
- }
-
- void SetDependency(QueryTask &task) {
- m_dep->fut = task.m_dep->prom.get_future();
- }
-
- void SetDependency(TaskDependency *dep) {
- m_dep->fut = dep->prom.get_future();
- }
+ size_t m_timestamp;
+ void *m_args;
- friend bool operator<(const QueryTask &self, const QueryTask &other) {
+ friend bool operator<(const Task &self, const Task &other) {
return self.m_timestamp < other.m_timestamp;
}
- friend bool operator>(const QueryTask &self, const QueryTask &other) {
+ friend bool operator>(const Task &self, const Task &other) {
return self.m_timestamp > other.m_timestamp;
}
-};
-struct GetTaskType {
- TaskType operator()(const MergeTask &t) { return t.get_type(); }
- TaskType operator()(const QueryTask &t) { return t.get_type(); }
+ void operator()() {
+ m_job(m_args);
+ }
};
-typedef std::variant<MergeTask, QueryTask> Task;
-
}