use super::unsupported; use crate::ffi::CStr; use crate::io; use crate::num::NonZero; use crate::ptr::NonNull; use crate::time::{Duration, Instant}; pub struct Thread(!); pub const DEFAULT_MIN_STACK_SIZE: usize = 64 * 1024; impl Thread { // unsafe: see thread::Builder::spawn_unchecked for safety requirements pub unsafe fn new( _stack: usize, _name: Option<&str>, _p: Box, ) -> io::Result { unsupported() } pub fn yield_now() { // do nothing } pub fn set_name(_name: &CStr) { // nope } pub fn sleep(dur: Duration) { let boot_services: NonNull = crate::os::uefi::env::boot_services().expect("can't sleep").cast(); let mut dur_ms = dur.as_micros(); // ceil up to the nearest microsecond if dur.subsec_nanos() % 1000 > 0 { dur_ms += 1; } while dur_ms > 0 { let ms = crate::cmp::min(dur_ms, usize::MAX as u128); let _ = unsafe { ((*boot_services.as_ptr()).stall)(ms as usize) }; dur_ms -= ms; } } pub fn sleep_until(deadline: Instant) { 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> { // UEFI is single threaded Ok(NonZero::new(1).unwrap()) }