diff --git a/src/kernel/synch.rs b/src/kernel/synch.rs index 83345f6..8eb4a39 100644 --- a/src/kernel/synch.rs +++ b/src/kernel/synch.rs @@ -5,7 +5,6 @@ use crate::simulator::machine::Machine; use std::cell::RefCell; use std::rc::Rc; -use super::system::System; use super::thread_manager::ThreadManager; /// Structure of a Semaphore used for synchronisation @@ -69,8 +68,9 @@ impl Semaphore { pub fn v(&mut self, machine: &mut Machine, thread_manager: &mut ThreadManager){ let old_status = machine.interrupt.set_status(InterruptOff); self.counter += 1; - if self.waiting_queue.peek() != None { - thread_manager.ready_to_run(self.waiting_queue.pop().unwrap()); + match self.waiting_queue.pop() { + Some(thread) => thread_manager.ready_to_run(thread), + None => () } machine.interrupt.set_status(old_status); } @@ -149,17 +149,20 @@ impl Lock { let old_status = machine.interrupt.set_status(InterruptOff); match thread_manager.get_g_current_thread() { - Some(thread) => { + Some(_) => { if self.held_by_current_thread(thread_manager) { - if self.waiting_queue.peek() != None { - self.owner = Some(self.waiting_queue.pop().unwrap()); - match &self.owner { - Some(x) => thread_manager.ready_to_run(Rc::clone(&x)), - None => () + match self.waiting_queue.pop() { + Some(thread) => { + self.owner = Some(thread); + match &self.owner { + Some(x) => thread_manager.ready_to_run(Rc::clone(&x)), + None => () + } + }, + None => { + self.free = true; + self.owner = None; } - } else { - self.free = true; - self.owner = None; } } } @@ -229,8 +232,9 @@ impl Condition { pub fn signal(&mut self, machine: &mut Machine, thread_manager: &mut ThreadManager) { let old_status = machine.interrupt.set_status(InterruptOff); - if self.waiting_queue.peek() != None { - thread_manager.ready_to_run(self.waiting_queue.pop().unwrap()); + match self.waiting_queue.pop() { + Some(thread) => thread_manager.ready_to_run(thread), + None => () } machine.interrupt.set_status(old_status); @@ -246,8 +250,9 @@ impl Condition { pub fn broadcast(&mut self, machine: &mut Machine, thread_manager: &mut ThreadManager) { let old_status = machine.interrupt.set_status(InterruptOff); - while self.waiting_queue.peek() != None { - thread_manager.ready_to_run(self.waiting_queue.pop().unwrap()); + match self.waiting_queue.pop() { + Some(thread) => thread_manager.ready_to_run(thread), + None => () } machine.interrupt.set_status(old_status);