From 1a7420ac9758040290fb97a52d0a0b78b98ba7a8 Mon Sep 17 00:00:00 2001 From: Yifan Wu Date: Thu, 9 Dec 2021 08:46:08 -0800 Subject: [PATCH] MutexBlocking works correctly. --- os/src/sync/mutex.rs | 3 ++- os/src/syscall/sync.rs | 15 ++++++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/os/src/sync/mutex.rs b/os/src/sync/mutex.rs index ef45bbf..fa13e8e 100644 --- a/os/src/sync/mutex.rs +++ b/os/src/sync/mutex.rs @@ -79,9 +79,10 @@ impl Mutex for MutexBlocking { fn unlock(&self) { let mut mutex_inner = self.inner.exclusive_access(); assert_eq!(mutex_inner.locked, true); - mutex_inner.locked = false; if let Some(waking_task) = mutex_inner.wait_queue.pop_front() { add_task(waking_task); + } else { + mutex_inner.locked = false; } } } diff --git a/os/src/syscall/sync.rs b/os/src/syscall/sync.rs index 370af84..4a2ac1d 100644 --- a/os/src/syscall/sync.rs +++ b/os/src/syscall/sync.rs @@ -1,5 +1,5 @@ use crate::task::{current_task, current_process, block_current_and_run_next}; -use crate::sync::{MutexSpin, MutexBlocking, Semaphore}; +use crate::sync::{Mutex, MutexSpin, MutexBlocking, Semaphore}; use crate::timer::{get_time_ms, add_timer}; use alloc::sync::Arc; @@ -13,6 +13,11 @@ pub fn sys_sleep(ms: usize) -> isize { pub fn sys_mutex_create(blocking: bool) -> isize { let process = current_process(); + let mutex: Option> = if !blocking { + Some(Arc::new(MutexSpin::new())) + } else { + Some(Arc::new(MutexBlocking::new())) + }; let mut process_inner = process.inner_exclusive_access(); if let Some(id) = process_inner .mutex_list @@ -20,14 +25,10 @@ pub fn sys_mutex_create(blocking: bool) -> isize { .enumerate() .find(|(_, item)| item.is_none()) .map(|(id, _)| id) { - process_inner.mutex_list[id] = if !blocking { - Some(Arc::new(MutexSpin::new())) - } else { - Some(Arc::new(MutexBlocking::new())) - }; + process_inner.mutex_list[id] = mutex; id as isize } else { - process_inner.mutex_list.push(Some(Arc::new(MutexSpin::new()))); + process_inner.mutex_list.push(mutex); process_inner.mutex_list.len() as isize - 1 } }