diff options
| author | Ada Christine <adachristine18@gmail.com> | 2022-02-14 16:13:23 +0000 |
|---|---|---|
| committer | Ada Christine <adachristine18@gmail.com> | 2022-02-14 16:22:54 +0000 |
| commit | e024c54be1b94093171eb4182c5fc21db5b2d7e2 (patch) | |
| tree | 9125564493b48f0562da484c628e02730e581cc6 /kc/core/task.c | |
| parent | f020142891decdf63e5908b4756bcaad9b0f5f7e (diff) | |
more task scheduling work, scheduler appears to work without crashing
Diffstat (limited to 'kc/core/task.c')
| -rw-r--r-- | kc/core/task.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/kc/core/task.c b/kc/core/task.c index b381793..09156d4 100644 --- a/kc/core/task.c +++ b/kc/core/task.c @@ -1,4 +1,5 @@ #include "task.h" +#include "timer.h" #include "memory.h" #include "panic.h" #include "cpu.h" @@ -16,6 +17,15 @@ static void set_thread_status(enum kc_thread_status status); static void idle_task_thread(void); extern uint64_t *get_tss_rsp0(void); +static uint64_t last_count = 0; + +void update_time_used(void) +{ + uint64_t current_count = timer_ticks(); + uint64_t elapsed = current_count - last_count; + last_count = current_count; + current_task->time_elapsed += elapsed; +} void task_set_thread(struct kc_thread *task) { @@ -26,6 +36,8 @@ void task_set_thread(struct kc_thread *task) void task_schedule(void) { + kprintf("task_schedule() called @%lu ticks\n", last_count); + update_time_used(); if (first_ready_task) { struct kc_thread *task = first_ready_task; @@ -34,6 +46,7 @@ void task_schedule(void) } } + static void lock_scheduler(void) { __asm__ volatile ("cli;"); @@ -64,6 +77,7 @@ static void unblock_thread(struct kc_thread *thread) first_ready_task->next = thread; first_ready_task = thread; } + unlock_scheduler(); } static void set_thread_status(enum kc_thread_status status) @@ -80,11 +94,10 @@ static void idle_task_thread(void) while (1) { __asm__ volatile ("hlt;"); + lock_scheduler(); + task_schedule(); + unlock_scheduler(); } - kputs("scheduling\n"); - lock_scheduler(); - task_schedule(); - unlock_scheduler(); } noreturn void task_init(void) |
