use crate::ffi::CStr; use crate::io; use crate::num::NonZero; use crate::time::{Duration, Instant}; pub struct Thread(!); pub const DEFAULT_MIN_STACK_SIZE: usize = 1024 * 1024; impl Thread { pub unsafe fn new( _stack: usize, _name: Option<&str>, _p: Box, ) -> io::Result { // Note that unlike WASIp1 even if the wasm `atomics` feature is enabled // there is no support for threads, not even experimentally, not even in // wasi-libc. Thus this is unconditionally unsupported. crate::sys::unsupported() } pub fn yield_now() { // no API for this in WASIp2, but there's also no threads, so that's // sort of expected. } pub fn set_name(_name: &CStr) { // nope } pub fn sleep(dur: Duration) { // Sleep in increments of `u64::MAX` nanoseconds until the `dur` is // entirely drained. let mut remaining = dur.as_nanos(); while remaining > 0 { let amt = u64::try_from(remaining).unwrap_or(u64::MAX); wasip2::clocks::monotonic_clock::subscribe_duration(amt).block(); remaining -= u128::from(amt); } } pub fn sleep_until(deadline: Instant) { match u64::try_from(deadline.into_inner().as_duration().as_nanos()) { // If the point in time we're sleeping to fits within a 64-bit // number of nanoseconds then directly use `subscribe_instant`. Ok(deadline) => { wasip2::clocks::monotonic_clock::subscribe_instant(deadline).block(); } // ... otherwise we're sleeping for 500+ years relative to the // "start" of what the system is using as a clock so speed/accuracy // is not so much of a concern. Use `sleep` instead. Err(_) => { let now = Instant::now(); if let Some(delay) = deadline.checked_duration_since(now) { Self::sleep(delay); } } } } pub fn join(self) { self.0 } } pub(crate) fn current_os_id() -> Option { None } pub fn available_parallelism() -> io::Result> { crate::sys::unsupported() }