MutexBlocking works correctly.
This commit is contained in:
parent
6c45c33b41
commit
1a7420ac97
2 changed files with 10 additions and 8 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue