#pragma once
|
|
|
|
#include "gp/containers/indexed_array.hpp"
|
|
#include "gp/system/process_data.hpp"
|
|
#include "gp/system/task_queue.hpp"
|
|
|
|
namespace gp {
|
|
namespace system {
|
|
class system;
|
|
|
|
/**
|
|
* @brief The class that handles the scheduling globally in a system
|
|
*/
|
|
struct scheduler {
|
|
task_queue::node_ptr previous;
|
|
task_queue::node_ptr current;
|
|
size_t id;
|
|
system& sys;
|
|
process_data main_context_data;
|
|
task_queue::node main_context;
|
|
|
|
no_inline_decl(
|
|
void yield_to(task_queue::node_ptr target)
|
|
);
|
|
|
|
scheduler(system&, size_t token);
|
|
|
|
scheduler(scheduler&& v)
|
|
: previous(v.previous)
|
|
, current(v.current)
|
|
, id(v.id)
|
|
, sys(v.sys)
|
|
, main_context_data(gp::move(v.main_context_data))
|
|
, main_context(gp::move(v.main_context))
|
|
{}
|
|
|
|
void run();
|
|
|
|
void yield();
|
|
|
|
~scheduler() {
|
|
|
|
}
|
|
};
|
|
|
|
}
|
|
}
|