about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authornewpavlov <newpavlov@gmail.com>2019-08-19 13:31:41 +0300
committernewpavlov <newpavlov@gmail.com>2019-08-19 13:31:41 +0300
commitcb52065d55e5ba1383aa155880a5e6661e6415a7 (patch)
tree3ede9feb39b4eb26bf866763cb2c922e0f4ba5cd /src/libstd
parent23cc850ff18652c7b75fa423f9dfff5526a239a7 (diff)
downloadrust-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.rs37
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"),
         }
     }