From 6f98224da140edd1b6b93e8a59bcf3e1e70fdb23 Mon Sep 17 00:00:00 2001 From: Quentin Legot Date: Wed, 1 Mar 2023 10:11:19 +0100 Subject: [PATCH] scheduler done --- src/kernel/mod.rs | 2 +- src/kernel/scheduler.rs | 46 ++++++++++++++++++++++++++++++++++++++--- src/utility/system.rs | 5 +++++ 3 files changed, 49 insertions(+), 4 deletions(-) diff --git a/src/kernel/mod.rs b/src/kernel/mod.rs index bb7bfe3..a5dc06d 100644 --- a/src/kernel/mod.rs +++ b/src/kernel/mod.rs @@ -1,3 +1,3 @@ mod process; -mod thread; +pub mod thread; mod scheduler; \ No newline at end of file diff --git a/src/kernel/scheduler.rs b/src/kernel/scheduler.rs index 34f81f9..1c70460 100644 --- a/src/kernel/scheduler.rs +++ b/src/kernel/scheduler.rs @@ -1,10 +1,11 @@ use crate::utility::list::List; use crate::kernel::thread::Thread; +use crate::utility::system::{g_current_thread, g_thread_to_be_destroyed}; use std::rc::Rc; struct Scheduler<> { - ready_list: List> + ready_list: List } impl Scheduler { @@ -24,9 +25,48 @@ impl Scheduler { /// /// ## Pamameter /// - /// **thread**: Thread is the thread to be put on the read list - pub fn ready_to_run(&mut self, thread: Rc) { + /// **thread** is the thread to be put on the read list + pub fn ready_to_run(&mut self, thread: Thread) { self.ready_list.push_back(thread); } + /// Return the next thread to be scheduled onto the CPU. + /// If there are no ready threads, return Option::None + /// + /// Thread is removed from the ready list. + /// + /// **return** Thread thread to be scheduled + pub fn find_next_to_run(&mut self) -> Option { + self.ready_list.pop_back() + } + + /// Dispatch the CPU to next_thread. Save the state of the old thread + /// and load the state of the new thread. + /// + /// We assume the state of the previously running thread has already been changed from running to blocked or ready. + /// + /// Global variable g_current_thread become next_thread + /// + /// ## Parameter + /// + /// **next_thread** thread to dispatch to the CPU + pub fn switch_to(&self, next_thread: Thread) { + let old_thread = Box::clone(&g_current_thread).unwrap(); + + g_current_thread.check_overflow(); + + g_current_thread = Box::new(Option::Some(next_thread)); + + old_thread.save_processor_state(); + old_thread.save_simulator_state(); + + if(old_thread != g_current_thread) { + next_thread.restore_processor_state(); + next_thread.restore_simulator_state(); + } + + if(g_thread_to_be_destroyed.is_some()) { + drop(g_thread_to_be_destroyed.take()); + } + } } \ No newline at end of file diff --git a/src/utility/system.rs b/src/utility/system.rs index bbcb003..642dd11 100644 --- a/src/utility/system.rs +++ b/src/utility/system.rs @@ -1,3 +1,8 @@ +use crate::kernel::thread::Thread; + + +pub static g_current_thread: Box> = Box::new(Option::None); +pub static g_thread_to_be_destroyed: Box> = Box::new(Option::None); pub enum ObjectType { SEMAPHORE_TYPE,