xref: /drstd/src/std/sys/sgx/thread_parking.rs (revision 9670759b785600bf6315e4173e46a602f16add7a)
1 use super::abi::usercalls;
2 use crate::std::io::ErrorKind;
3 use crate::std::time::Duration;
4 use fortanix_sgx_abi::{EV_UNPARK, WAIT_INDEFINITE};
5 
6 pub type ThreadId = fortanix_sgx_abi::Tcs;
7 
8 pub use super::abi::thread::current;
9 
park(_hint: usize)10 pub fn park(_hint: usize) {
11     usercalls::wait(EV_UNPARK, WAIT_INDEFINITE).unwrap();
12 }
13 
park_timeout(dur: Duration, _hint: usize)14 pub fn park_timeout(dur: Duration, _hint: usize) {
15     let timeout = u128::min(dur.as_nanos(), WAIT_INDEFINITE as u128 - 1) as u64;
16     if let Err(e) = usercalls::wait(EV_UNPARK, timeout) {
17         assert!(matches!(
18             e.kind(),
19             ErrorKind::TimedOut | ErrorKind::WouldBlock
20         ))
21     }
22 }
23 
unpark(tid: ThreadId, _hint: usize)24 pub fn unpark(tid: ThreadId, _hint: usize) {
25     let _ = usercalls::send(EV_UNPARK, Some(tid));
26 }
27