diff --git a/a.out b/a.out new file mode 100644 index 00000000..e69de29b diff --git a/kernel/src/kmain.rs b/kernel/src/kmain.rs index 72cb2e33..e6bd82e6 100644 --- a/kernel/src/kmain.rs +++ b/kernel/src/kmain.rs @@ -66,7 +66,7 @@ pub fn kmain(cmdline: &str, boot_modules: BootModules) -> ! { // use {crate::host::TrapHandler, hbvm::vm::Vm}; let mut sched = Scheduler::new(); sched.new_process(prog.clone()); - sched.scheduler_loop(); + sched.scheduler_run(); // let mut vm; // unsafe { // vm = Vm::new_unchecked(&prog, TrapHandler); diff --git a/kernel/src/scheduler.rs b/kernel/src/scheduler.rs index 8af7bfa3..066bb531 100644 --- a/kernel/src/scheduler.rs +++ b/kernel/src/scheduler.rs @@ -1,26 +1,37 @@ -use alloc::{collections::VecDeque, vec::Vec, rc::Rc, slice}; -use hbvm::validate::validate; +use { + alloc::{collections::VecDeque, rc::Rc, slice, vec::Vec}, + hbvm::validate::validate, +}; use {crate::host::TrapHandler, hbvm::vm::Vm}; pub struct Scheduler<'a> { data: VecDeque>, + pub tick_callback: Option u64>, + pub last_timer_count: u64, + pub tick_limit: u64, } +// NOTE: This is a very simple schduler and it sucks and should be replaced with a better one +// Written By Yours Truly: Munir + + + impl Scheduler<'_> { pub fn new() -> Self { Self { data: VecDeque::new(), + tick_callback: None, + last_timer_count: 0, + tick_limit: 64, } } pub fn new_process(&mut self, program: Vec) { let prog = program.clone(); let prog_arc = Rc::new(prog); - + let binding = Rc::try_unwrap(prog_arc).ok().unwrap(); - - - + #[allow(clippy::redundant_else)] if let Err(e) = validate(&program.as_slice()) { log::error!("Program validation error: {e:?}"); @@ -35,11 +46,21 @@ impl Scheduler<'_> { } } - pub fn scheduler_loop(&mut self){ + pub fn scheduler_run(&mut self) -> Option { loop { let mut prog = self.data.pop_front().unwrap(); prog.run().unwrap(); self.data.push_back(prog); + if self.tick_callback.is_some() { + let ret = self.tick_callback.unwrap()(); + if (ret - self.last_timer_count) >= self.tick_limit { + + return Some(0); + + } + } + break; } + Some(1) } }