1
1
use crate :: cmp;
2
2
use crate :: ffi:: CStr ;
3
3
use crate :: io;
4
- use crate :: sys :: cvt ;
4
+ use crate :: mem ;
5
5
use crate :: sys:: { unsupported, Void } ;
6
6
use crate :: time:: Duration ;
7
7
use libc;
@@ -28,19 +28,28 @@ impl Thread {
28
28
}
29
29
30
30
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" ) ,
44
53
}
45
54
}
46
55
0 commit comments