Add MutexSpin and several syscalls.

This commit is contained in:
Yifan Wu 2021-10-07 12:40:47 -07:00
parent d1e55d85d8
commit 8974a29245
8 changed files with 159 additions and 2 deletions

40
os/src/syscall/sync.rs Normal file
View file

@ -0,0 +1,40 @@
use crate::task::current_process;
use crate::sync::MutexSpin;
use alloc::sync::Arc;
pub fn sys_mutex_create() -> isize {
let process = current_process();
let mut process_inner = process.inner_exclusive_access();
if let Some(id) = process_inner
.mutex_list
.iter()
.enumerate()
.find(|(_, item)| item.is_none())
.map(|(id, _)| id) {
process_inner.mutex_list[id] = Some(Arc::new(MutexSpin::new()));
id as isize
} else {
process_inner.mutex_list.push(Some(Arc::new(MutexSpin::new())));
process_inner.mutex_list.len() as isize - 1
}
}
pub fn sys_mutex_lock(mutex_id: usize) -> isize {
let process = current_process();
let process_inner = process.inner_exclusive_access();
let mutex = Arc::clone(process_inner.mutex_list[mutex_id].as_ref().unwrap());
drop(process_inner);
drop(process);
mutex.lock();
0
}
pub fn sys_mutex_unlock(mutex_id: usize) -> isize {
let process = current_process();
let process_inner = process.inner_exclusive_access();
let mutex = Arc::clone(process_inner.mutex_list[mutex_id].as_ref().unwrap());
drop(process_inner);
drop(process);
mutex.unlock();
0
}