89 lines
2.7 KiB
Rust
89 lines
2.7 KiB
Rust
use crate::task::{current_task, current_process, block_current_and_run_next};
|
|
use crate::sync::{MutexSpin, MutexBlocking, Semaphore};
|
|
use crate::timer::{get_time_ms, add_timer};
|
|
use alloc::sync::Arc;
|
|
|
|
pub fn sys_sleep(ms: usize) -> isize {
|
|
let expire_ms = get_time_ms() + ms;
|
|
let task = current_task().unwrap();
|
|
add_timer(expire_ms, task);
|
|
block_current_and_run_next();
|
|
0
|
|
}
|
|
|
|
pub fn sys_mutex_create(blocking: bool) -> 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] = if !blocking {
|
|
Some(Arc::new(MutexSpin::new()))
|
|
} else {
|
|
Some(Arc::new(MutexBlocking::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
|
|
}
|
|
|
|
pub fn sys_semaphore_creare(res_count: usize) -> isize {
|
|
let process = current_process();
|
|
let mut process_inner = process.inner_exclusive_access();
|
|
let id = if let Some(id) = process_inner
|
|
.semaphore_list
|
|
.iter()
|
|
.enumerate()
|
|
.find(|(_, item)| item.is_none())
|
|
.map(|(id, _)| id) {
|
|
process_inner.semaphore_list[id] = Some(Arc::new(Semaphore::new(res_count)));
|
|
id
|
|
} else {
|
|
process_inner.semaphore_list.push(Some(Arc::new(Semaphore::new(res_count))));
|
|
process_inner.semaphore_list.len() - 1
|
|
};
|
|
id as isize
|
|
}
|
|
|
|
pub fn sys_semaphore_up(sem_id: usize) -> isize {
|
|
let process = current_process();
|
|
let process_inner = process.inner_exclusive_access();
|
|
let sem = Arc::clone(process_inner.semaphore_list[sem_id].as_ref().unwrap());
|
|
drop(process_inner);
|
|
sem.up();
|
|
0
|
|
}
|
|
|
|
pub fn sys_semaphore_down(sem_id: usize) -> isize {
|
|
let process = current_process();
|
|
let process_inner = process.inner_exclusive_access();
|
|
let sem = Arc::clone(process_inner.semaphore_list[sem_id].as_ref().unwrap());
|
|
drop(process_inner);
|
|
sem.down();
|
|
0
|
|
}
|