]> git.lizzy.rs Git - rust.git/blob - library/std/src/sys/wasi/thread.rs
Rollup merge of #105860 - Ezrashaw:add-long-errors-0460-0457, r=jruderman,GuillaumeGomez
[rust.git] / library / std / src / sys / wasi / thread.rs
1 #![deny(unsafe_op_in_unsafe_fn)]
2
3 use crate::ffi::CStr;
4 use crate::io;
5 use crate::mem;
6 use crate::num::NonZeroUsize;
7 use crate::sys::unsupported;
8 use crate::time::Duration;
9
10 pub struct Thread(!);
11
12 pub const DEFAULT_MIN_STACK_SIZE: usize = 4096;
13
14 impl Thread {
15     // unsafe: see thread::Builder::spawn_unchecked for safety requirements
16     pub unsafe fn new(_stack: usize, _p: Box<dyn FnOnce()>) -> io::Result<Thread> {
17         unsupported()
18     }
19
20     pub fn yield_now() {
21         let ret = unsafe { wasi::sched_yield() };
22         debug_assert_eq!(ret, Ok(()));
23     }
24
25     pub fn set_name(_name: &CStr) {
26         // nope
27     }
28
29     pub fn sleep(dur: Duration) {
30         let nanos = dur.as_nanos();
31         assert!(nanos <= u64::MAX as u128);
32
33         const USERDATA: wasi::Userdata = 0x0123_45678;
34
35         let clock = wasi::SubscriptionClock {
36             id: wasi::CLOCKID_MONOTONIC,
37             timeout: nanos as u64,
38             precision: 0,
39             flags: 0,
40         };
41
42         let in_ = wasi::Subscription {
43             userdata: USERDATA,
44             u: wasi::SubscriptionU { tag: 0, u: wasi::SubscriptionUU { clock } },
45         };
46         unsafe {
47             let mut event: wasi::Event = mem::zeroed();
48             let res = wasi::poll_oneoff(&in_, &mut event, 1);
49             match (res, event) {
50                 (
51                     Ok(1),
52                     wasi::Event {
53                         userdata: USERDATA,
54                         error: wasi::ERRNO_SUCCESS,
55                         type_: wasi::EVENTTYPE_CLOCK,
56                         ..
57                     },
58                 ) => {}
59                 _ => panic!("thread::sleep(): unexpected result of poll_oneoff"),
60             }
61         }
62     }
63
64     pub fn join(self) {
65         self.0
66     }
67 }
68
69 pub fn available_parallelism() -> io::Result<NonZeroUsize> {
70     unsupported()
71 }
72
73 pub mod guard {
74     pub type Guard = !;
75     pub unsafe fn current() -> Option<Guard> {
76         None
77     }
78     pub unsafe fn init() -> Option<Guard> {
79         None
80     }
81 }