diff options
| author | newpavlov <newpavlov@gmail.com> | 2019-08-19 13:31:41 +0300 |
|---|---|---|
| committer | newpavlov <newpavlov@gmail.com> | 2019-08-19 13:31:41 +0300 |
| commit | cb52065d55e5ba1383aa155880a5e6661e6415a7 (patch) | |
| tree | 3ede9feb39b4eb26bf866763cb2c922e0f4ba5cd /src/libstd | |
| parent | 23cc850ff18652c7b75fa423f9dfff5526a239a7 (diff) | |
| download | rust-cb52065d55e5ba1383aa155880a5e6661e6415a7.tar.gz rust-cb52065d55e5ba1383aa155880a5e6661e6415a7.zip | |
replace libc::nanosleep with wasi::poll_oneoff
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/sys/wasi/thread.rs | 37 |
1 files changed, 23 insertions, 14 deletions
diff --git a/src/libstd/sys/wasi/thread.rs b/src/libstd/sys/wasi/thread.rs index 9e0726432d9..eedc584dde5 100644 --- a/src/libstd/sys/wasi/thread.rs +++ b/src/libstd/sys/wasi/thread.rs @@ -1,7 +1,7 @@ use crate::cmp; use crate::ffi::CStr; use crate::io; -use crate::sys::cvt; +use crate::mem; use crate::sys::{unsupported, Void}; use crate::time::Duration; use libc; @@ -28,19 +28,28 @@ impl Thread { } pub fn sleep(dur: Duration) { - let mut secs = dur.as_secs(); - let mut nsecs = dur.subsec_nanos() as i32; - - unsafe { - while secs > 0 || nsecs > 0 { - let mut ts = libc::timespec { - tv_sec: cmp::min(libc::time_t::max_value() as u64, secs) as libc::time_t, - tv_nsec: nsecs, - }; - secs -= ts.tv_sec as u64; - cvt(libc::nanosleep(&ts, &mut ts)).unwrap(); - nsecs = 0; - } + let nanos = dur.as_nanos(); + assert!(nanos <= u64::max_value() as u128); + + let clock = wasi::raw::__wasi_subscription_u_clock_t { + identifier: 0, + clock_id: wasi::CLOCK_MONOTONIC, + timeout: nanos as u64, + precision: 0, + flags: 0, + }; + + let in_ = [wasi::Subscription { + userdata: 0, + type_: wasi::EVENTTYPE_CLOCK, + u: wasi::raw::__wasi_subscription_u { clock: clock }, + }]; + let mut out: [wasi::Event; 1] = [unsafe { mem::zeroed() }]; + let n = wasi::poll_oneoff(&in_, &mut out).unwrap(); + let wasi::Event { userdata, error, type_, .. } = out[0]; + match (n, userdata, error) { + (1, 0, 0) if type_ == wasi::EVENTTYPE_CLOCK => {} + _ => panic!("thread::sleep(): unexpected result of poll_oneof"), } } |
