diff --git a/src/kernel/synch.rs b/src/kernel/synch.rs index aa96618..5a9eb93 100644 --- a/src/kernel/synch.rs +++ b/src/kernel/synch.rs @@ -67,8 +67,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,15 +150,18 @@ impl Lock { match thread_manager.get_g_current_thread() { Some(_) => { if self.held_by_current_thread(thread_manager) { - if self.waiting_queue.peek().is_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 +233,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().is_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 +251,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().is_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); diff --git a/src/kernel/thread_manager.rs b/src/kernel/thread_manager.rs index f5368cf..fc0a614 100644 --- a/src/kernel/thread_manager.rs +++ b/src/kernel/thread_manager.rs @@ -189,4 +189,11 @@ impl ThreadManager { self.g_thread_to_be_destroyed = thread } +} + +#[cfg(test)] +mod test { + + + } \ No newline at end of file