Skip to content

Commit

Permalink
Implement sys/thread for UEFI
Browse files Browse the repository at this point in the history
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

Signed-off-by: Ayush Singh <ayushdevel1325@gmail.com>
  • Loading branch information
Ayush1325 committed Feb 11, 2024
1 parent 899c895 commit 75955d5
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 1 deletion.
1 change: 0 additions & 1 deletion library/std/src/sys/pal/uefi/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ pub mod pipe;
#[path = "../unsupported/process.rs"]
pub mod process;
pub mod stdio;
#[path = "../unsupported/thread.rs"]
pub mod thread;
#[path = "../unsupported/thread_local_key.rs"]
pub mod thread_local_key;
Expand Down
50 changes: 50 additions & 0 deletions library/std/src/sys/pal/uefi/thread.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
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 _ = unsafe { ((*boot_services.as_ptr()).stall)(dur.as_micros() as usize) };
}

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
}
}

0 comments on commit 75955d5

Please sign in to comment.