#![allow(dead_code)] use crate::ffi::CStr; use crate::fmt; use crate::io; use crate::mem; use crate::sys::hermit::abi; use crate::time::Duration; use core::u32; use crate::sys_common::thread::*; pub type Tid = abi::Tid; /// Priority of a task #[derive(PartialEq, Eq, PartialOrd, Ord, Debug, Clone, Copy)] pub struct Priority(u8); impl Priority { pub const fn into(self) -> u8 { self.0 } pub const fn from(x: u8) -> Self { Priority(x) } } impl fmt::Display for Priority { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{}", self.0) } } pub const NORMAL_PRIO: Priority = Priority::from(2); pub struct Thread { tid: Tid, } unsafe impl Send for Thread {} unsafe impl Sync for Thread {} pub const DEFAULT_MIN_STACK_SIZE: usize = 262144; impl Thread { pub unsafe fn new_with_coreid( _stack: usize, p: Box, core_id: isize, ) -> io::Result { let p = box p; let mut tid: Tid = u32::MAX; let ret = abi::spawn( &mut tid as *mut Tid, thread_start, &*p as *const _ as *const u8 as usize, Priority::into(NORMAL_PRIO), core_id, ); return if ret == 0 { mem::forget(p); // ownership passed to pthread_create Ok(Thread { tid: tid }) } else { Err(io::Error::new(io::ErrorKind::Other, "Unable to create thread!")) }; extern "C" fn thread_start(main: usize) { unsafe { start_thread(main as *mut u8); } } } pub unsafe fn new(stack: usize, p: Box) -> io::Result { Thread::new_with_coreid(stack, p, -1 /* = no specific core */) } #[inline] pub fn yield_now() { unsafe { abi::yield_now(); } } #[inline] pub fn set_name(_name: &CStr) { // nope } #[inline] pub fn sleep(dur: Duration) { unsafe { abi::usleep(dur.as_micros() as u64); } } pub fn join(self) { unsafe { let _ = abi::join(self.tid); } } #[inline] pub fn id(&self) -> Tid { self.tid } #[inline] pub fn into_id(self) -> Tid { let id = self.tid; mem::forget(self); id } } pub mod guard { pub type Guard = !; pub unsafe fn current() -> Option { None } pub unsafe fn init() -> Option { None } }