| use crate::time::{Duration, Instant}; |
| |
| 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) { |
| sleep(delay); |
| } |
| } |
| } |
| } |