Auto merge of #120938 - Ayush1325:uefi-thread, r=joboet,Nilstrieb
Implement sys/thread for UEFI Since UEFI has no concept of threads, most of this module can be ignored. However, implementing parts that make sense. - Implement sleep - Implement available_parallelism
This commit is contained in:
commit
09d73fab08
@ -31,7 +31,6 @@
|
|||||||
#[path = "../unsupported/process.rs"]
|
#[path = "../unsupported/process.rs"]
|
||||||
pub mod process;
|
pub mod process;
|
||||||
pub mod stdio;
|
pub mod stdio;
|
||||||
#[path = "../unsupported/thread.rs"]
|
|
||||||
pub mod thread;
|
pub mod thread;
|
||||||
#[path = "../unsupported/thread_local_key.rs"]
|
#[path = "../unsupported/thread_local_key.rs"]
|
||||||
pub mod thread_local_key;
|
pub mod thread_local_key;
|
||||||
|
60
library/std/src/sys/pal/uefi/thread.rs
Normal file
60
library/std/src/sys/pal/uefi/thread.rs
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
use super::unsupported;
|
||||||
|
use crate::ffi::CStr;
|
||||||
|
use crate::io;
|
||||||
|
use crate::num::NonZeroUsize;
|
||||||
|
use crate::ptr::NonNull;
|
||||||
|
use crate::time::Duration;
|
||||||
|
|
||||||
|
pub struct Thread(!);
|
||||||
|
|
||||||
|
pub const DEFAULT_MIN_STACK_SIZE: usize = 4096;
|
||||||
|
|
||||||
|
impl Thread {
|
||||||
|
// unsafe: see thread::Builder::spawn_unchecked for safety requirements
|
||||||
|
pub unsafe fn new(_stack: usize, _p: Box<dyn FnOnce()>) -> io::Result<Thread> {
|
||||||
|
unsupported()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn yield_now() {
|
||||||
|
// do nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn set_name(_name: &CStr) {
|
||||||
|
// nope
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn sleep(dur: Duration) {
|
||||||
|
let boot_services: NonNull<r_efi::efi::BootServices> =
|
||||||
|
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 join(self) {
|
||||||
|
self.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn available_parallelism() -> io::Result<NonZeroUsize> {
|
||||||
|
// UEFI is single threaded
|
||||||
|
Ok(NonZeroUsize::new(1).unwrap())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub mod guard {
|
||||||
|
pub type Guard = !;
|
||||||
|
pub unsafe fn current() -> Option<Guard> {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
pub unsafe fn init() -> Option<Guard> {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user