From 95cd78840f0891e60f5ebecc8a8eb4fbaf3c2ebf Mon Sep 17 00:00:00 2001 From: Danny Holman Date: Sun, 12 Jan 2025 01:17:36 -0600 Subject: PROJECT RESTRUCTURING Move the entire kernel into its own directory. Create new directories for system commands, libraries and other required essentials for a complete Unix-like operating system. Signed-off-by: Danny Holman --- kernel/core/sched.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 kernel/core/sched.c (limited to 'kernel/core/sched.c') diff --git a/kernel/core/sched.c b/kernel/core/sched.c new file mode 100644 index 0000000..b6096da --- /dev/null +++ b/kernel/core/sched.c @@ -0,0 +1,74 @@ +#include +#include +#include +#include +#include +#include +#include + +static struct kthread *run_queue = NULL; +static struct kthread *wait_queue = NULL; +static struct kthread *cur = NULL; + +static int scheduler_enabled = 0; +static struct kmutex scheduler_lock; + +void sched_init(void) { + disable_ints(); + cur = kthread_create(NULL, NULL); + cur->stack = NULL; + switch_thread(cur, cur); + cur->state = THREAD_RUNNING; + scheduler_enabled = 1; + enable_ints(); +} + +void schedule_next(void) { + if (scheduler_enabled == 0) + return; + if (run_queue == NULL) + return; + + struct kthread *thread = cur; + schedule_thread(cur); + cur = run_queue; + run_queue = run_queue->next; + cur->next = NULL; + cur->state = THREAD_RUNNING; + switch_thread(thread, cur); +} + +void schedule_thread(struct kthread *thread) { + if (run_queue == NULL) { + run_queue = thread; + return; + } + + kmutex_lock(&scheduler_lock); + struct kthread *temp = run_queue; + while (temp->next != NULL) + temp = temp->next; + temp->next = thread; + thread->state = THREAD_READY; + kmutex_unlock(&scheduler_lock); +} + +void block_thread(struct kthread *thread) { + kmutex_lock(&scheduler_lock); + thread->next = wait_queue; + wait_queue = thread; + kmutex_unlock(&scheduler_lock); +} + +void unblock_thread(struct kthread *thread) { + kmutex_lock(&scheduler_lock); + struct kthread *temp = wait_queue; + while (temp != NULL) { + if (temp->next == thread) { + temp->next = thread->next; + return; + } + temp = temp->next; + } + kmutex_unlock(&scheduler_lock); +} -- cgit v1.2.3