Skip to content

Commit cb52065

Browse files
committed
replace libc::nanosleep with wasi::poll_oneoff
1 parent 23cc850 commit cb52065

File tree

1 file changed

+23
-14
lines changed

1 file changed

+23
-14
lines changed

src/libstd/sys/wasi/thread.rs

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::cmp;
22
use crate::ffi::CStr;
33
use crate::io;
4-
use crate::sys::cvt;
4+
use crate::mem;
55
use crate::sys::{unsupported, Void};
66
use crate::time::Duration;
77
use libc;
@@ -28,19 +28,28 @@ impl Thread {
2828
}
2929

3030
pub fn sleep(dur: Duration) {
31-
let mut secs = dur.as_secs();
32-
let mut nsecs = dur.subsec_nanos() as i32;
33-
34-
unsafe {
35-
while secs > 0 || nsecs > 0 {
36-
let mut ts = libc::timespec {
37-
tv_sec: cmp::min(libc::time_t::max_value() as u64, secs) as libc::time_t,
38-
tv_nsec: nsecs,
39-
};
40-
secs -= ts.tv_sec as u64;
41-
cvt(libc::nanosleep(&ts, &mut ts)).unwrap();
42-
nsecs = 0;
43-
}
31+
let nanos = dur.as_nanos();
32+
assert!(nanos <= u64::max_value() as u128);
33+
34+
let clock = wasi::raw::__wasi_subscription_u_clock_t {
35+
identifier: 0,
36+
clock_id: wasi::CLOCK_MONOTONIC,
37+
timeout: nanos as u64,
38+
precision: 0,
39+
flags: 0,
40+
};
41+
42+
let in_ = [wasi::Subscription {
43+
userdata: 0,
44+
type_: wasi::EVENTTYPE_CLOCK,
45+
u: wasi::raw::__wasi_subscription_u { clock: clock },
46+
}];
47+
let mut out: [wasi::Event; 1] = [unsafe { mem::zeroed() }];
48+
let n = wasi::poll_oneoff(&in_, &mut out).unwrap();
49+
let wasi::Event { userdata, error, type_, .. } = out[0];
50+
match (n, userdata, error) {
51+
(1, 0, 0) if type_ == wasi::EVENTTYPE_CLOCK => {}
52+
_ => panic!("thread::sleep(): unexpected result of poll_oneof"),
4453
}
4554
}
4655

0 commit comments

Comments
 (0)