aboutsummaryrefslogtreecommitdiff
path: root/src/scheduler.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/scheduler.cc')
-rw-r--r--src/scheduler.cc25
1 files changed, 15 insertions, 10 deletions
diff --git a/src/scheduler.cc b/src/scheduler.cc
index 1557e28..4de9fff 100644
--- a/src/scheduler.cc
+++ b/src/scheduler.cc
@@ -9,20 +9,24 @@ void task_b(void) {
while (true) printk("B");
}
+constexpr uint16_t max_tasks = 256;
+static cpu_state_t* tasks[max_tasks];
+
static uint8_t stack_a[4096] = {0};
static uint8_t stack_b[4096] = {0};
-constexpr uint16_t max_tasks = 2;
-static cpu_state_t* tasks[max_tasks];
Scheduler::Scheduler(uint16_t cs) : InterruptHandler(0x00) {
- add_task(stack_a, cs, &task_a);
- add_task(stack_b, cs, task_b);
+ printk("add_task: ", add_task(stack_b, cs, task_b), '\n');
+ printk("add_task: ", add_task(stack_a, cs, task_a), '\n');
+
+ printk("task0 eip: ", uhex{tasks[0]->eip}, '\n');
+ printk("task1 eip: ", uhex{tasks[1]->eip}, '\n');
}
-bool Scheduler::add_task(uint8_t* stack, uint16_t cs, void (*entry)()) {
- if (last_task_id == uint16_t_max) return false;
+uint16_t Scheduler::add_task(uint8_t* stack, uint16_t cs, void (*entry)()) {
+ if (last_task_id == (max_tasks - 1)) return 0;
- uint16_t id = last_task_id++;
+ uint16_t id = ++last_task_id;
++num_tasks;
cpu_state_t* cpu_state = reinterpret_cast<cpu_state_t*>(stack + 4096 - sizeof(cpu_state_t));
@@ -33,14 +37,15 @@ bool Scheduler::add_task(uint8_t* stack, uint16_t cs, void (*entry)()) {
tasks[id] = cpu_state;
printk("adding task: cs ", uhex{cpu_state->cs}, " stack ", uhex{reinterpret_cast<uint32_t>(tasks[id])}, " entry ",
uhex{cpu_state->eip}, '\n');
- return true;
+ return id;
}
cpu_state_t* Scheduler::trigger(cpu_state_t* cpu) {
tasks[current_task] = cpu;
- if (++current_task >= num_tasks) current_task %= num_tasks;
+ current_task++;
+ if (current_task > num_tasks) current_task = 0;
- // printk("swapped to task ", current_task, '\n');
+ printk("\n\nswapped to task ", current_task, '\n');
return tasks[current_task];
}