MutexBlocking works correctly.

This commit is contained in:
Yifan Wu 2021-12-09 08:46:08 -08:00
parent 6c45c33b41
commit 1a7420ac97
2 changed files with 10 additions and 8 deletions

View file

@ -79,9 +79,10 @@ impl Mutex for MutexBlocking {
fn unlock(&self) { fn unlock(&self) {
let mut mutex_inner = self.inner.exclusive_access(); let mut mutex_inner = self.inner.exclusive_access();
assert_eq!(mutex_inner.locked, true); assert_eq!(mutex_inner.locked, true);
mutex_inner.locked = false;
if let Some(waking_task) = mutex_inner.wait_queue.pop_front() { if let Some(waking_task) = mutex_inner.wait_queue.pop_front() {
add_task(waking_task); add_task(waking_task);
} else {
mutex_inner.locked = false;
} }
} }
} }

View file

@ -1,5 +1,5 @@
use crate::task::{current_task, current_process, block_current_and_run_next}; 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 crate::timer::{get_time_ms, add_timer};
use alloc::sync::Arc; use alloc::sync::Arc;
@ -13,6 +13,11 @@ pub fn sys_sleep(ms: usize) -> isize {
pub fn sys_mutex_create(blocking: bool) -> isize { pub fn sys_mutex_create(blocking: bool) -> isize {
let process = current_process(); let process = current_process();
let mutex: Option<Arc<dyn Mutex>> = if !blocking {
Some(Arc::new(MutexSpin::new()))
} else {
Some(Arc::new(MutexBlocking::new()))
};
let mut process_inner = process.inner_exclusive_access(); let mut process_inner = process.inner_exclusive_access();
if let Some(id) = process_inner if let Some(id) = process_inner
.mutex_list .mutex_list
@ -20,14 +25,10 @@ pub fn sys_mutex_create(blocking: bool) -> isize {
.enumerate() .enumerate()
.find(|(_, item)| item.is_none()) .find(|(_, item)| item.is_none())
.map(|(id, _)| id) { .map(|(id, _)| id) {
process_inner.mutex_list[id] = if !blocking { process_inner.mutex_list[id] = mutex;
Some(Arc::new(MutexSpin::new()))
} else {
Some(Arc::new(MutexBlocking::new()))
};
id as isize id as isize
} else { } 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 process_inner.mutex_list.len() as isize - 1
} }
} }