safa_api/syscalls/
futex.rs1use core::sync::atomic::AtomicU32;
2use core::time::Duration;
3
4use safa_abi::errors::ErrorStatus;
5
6use crate::syscalls::types::OptionalPtrMut;
7use crate::syscalls::types::RequiredPtr;
8use crate::syscalls::types::RequiredPtrMut;
9
10use super::define_syscall;
11use super::err_from_u16;
12use super::SyscallNum;
13
14define_syscall! {
15 SyscallNum::SysTFutWake => {
16 syst_fut_wake(addr: RequiredPtr<AtomicU32>, n: usize, wake_results: OptionalPtrMut<usize>)
20 },
21 SyscallNum::SysTFutWait => {
22 syst_fut_wait(addr: RequiredPtr<AtomicU32>, val: u32, timeout_ms: u64, wait_results: OptionalPtrMut<bool>)
27 }
28}
29
30#[inline]
36pub fn futex_wake(addr: &AtomicU32, n: usize) -> Result<usize, ErrorStatus> {
37 let mut results = 0;
38
39 let results_ptr = RequiredPtrMut::new(&mut results).into();
40 let addr = unsafe { RequiredPtr::new_unchecked(addr as *const _ as *mut _) };
42
43 err_from_u16!(syst_fut_wake(addr, n, results_ptr), results)
44}
45
46#[inline]
51pub fn futex_wait(
52 addr: &AtomicU32,
53 val: u32,
54 timeout_duration: Duration,
55) -> Result<bool, ErrorStatus> {
56 let timeout_ms = timeout_duration.as_millis() as u64;
57
58 let mut results = false;
59 let results_ptr = RequiredPtrMut::new(&mut results).into();
60 let addr = unsafe { RequiredPtrMut::new_unchecked(addr as *const _ as *mut _) };
61
62 err_from_u16!(syst_fut_wait(addr, val, timeout_ms, results_ptr), results)
63}