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 }