From cf65688566a91af5fb0df795432c8eb8ce591caa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Rativel?= Date: Wed, 8 Mar 2023 15:45:35 +0100 Subject: [PATCH] Sarting synch.rs implementation --- src/kernel/mod.rs | 3 ++- src/kernel/synch.rs | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 src/kernel/synch.rs diff --git a/src/kernel/mod.rs b/src/kernel/mod.rs index e061a2a..f1abafa 100644 --- a/src/kernel/mod.rs +++ b/src/kernel/mod.rs @@ -3,4 +3,5 @@ pub mod thread; pub mod scheduler; pub mod mgerror; pub mod system; -mod ucontext; \ No newline at end of file +mod ucontext; +mod synch; \ No newline at end of file diff --git a/src/kernel/synch.rs b/src/kernel/synch.rs new file mode 100644 index 0000000..8a7fe98 --- /dev/null +++ b/src/kernel/synch.rs @@ -0,0 +1,43 @@ +use crate::utility::list::List; +use crate::kernel::thread::Thread; +use std::rc::Rc; +use crate::simulator::interrupt::InterruptStatus::InterruptOff; +use crate::simulator::machine::Machine; + +pub struct Semaphore{ + + counter:i32, + waiting_queue:List> + +} + +impl Semaphore{ + + pub fn p(&mut self, current_thread:Rc, machine: &mut Machine){ + let old_status = machine.interrupt.set_status(InterruptOff); + self.counter-=1; + if self.counter < 0 { + self.waiting_queue.push(Rc::clone(¤t_thread)); + current_thread.sleep(); + } + machine.interrupt.set_status(old_status); + } + + pub fn v(&mut self, current_thread:Rc, machine: &mut Machine){ + let old_status = machine.interrupt.set_status(InterruptOff); + self.counter-=1; + if self.waiting_queue.peek == None { + self.waiting_queue.push(Rc::clone(¤t_thread)); + current_thread.sleep(); + } + machine.interrupt.set_status(old_status); + } +} + +pub struct Lock{ + +} + +pub struct Condition{ + +} \ No newline at end of file