@@ -3,7 +3,7 @@ use crate::io;
33use crate :: mem;
44use crate :: num:: NonZeroUsize ;
55use crate :: sys:: unsupported;
6- use crate :: time:: Duration ;
6+ use crate :: time:: { Duration , Instant } ;
77
88cfg_if:: cfg_if! {
99 if #[ cfg( target_feature = "atomics" ) ] {
@@ -138,35 +138,18 @@ impl Thread {
138138 let nanos = dur. as_nanos ( ) ;
139139 assert ! ( nanos <= u64 :: MAX as u128 ) ;
140140
141- const USERDATA : wasi:: Userdata = 0x0123_45678 ;
142-
143- let clock = wasi:: SubscriptionClock {
144- id : wasi:: CLOCKID_MONOTONIC ,
145- timeout : nanos as u64 ,
146- precision : 0 ,
147- flags : 0 ,
148- } ;
149-
150- let in_ = wasi:: Subscription {
151- userdata : USERDATA ,
152- u : wasi:: SubscriptionU { tag : 0 , u : wasi:: SubscriptionUU { clock } } ,
153- } ;
154- unsafe {
155- let mut event: wasi:: Event = mem:: zeroed ( ) ;
156- let res = wasi:: poll_oneoff ( & in_, & mut event, 1 ) ;
157- match ( res, event) {
158- (
159- Ok ( 1 ) ,
160- wasi:: Event {
161- userdata : USERDATA ,
162- error : wasi:: ERRNO_SUCCESS ,
163- type_ : wasi:: EVENTTYPE_CLOCK ,
164- ..
165- } ,
166- ) => { }
167- _ => panic ! ( "thread::sleep(): unexpected result of poll_oneoff" ) ,
168- }
169- }
141+ sleep_with ( nanos as u64 , wasi:: CLOCKID_MONOTONIC , 0 ) ;
142+ }
143+
144+ pub fn sleep_until ( deadline : Instant ) {
145+ let nanos = deadline. into_inner ( ) . into_inner ( ) . as_nanos ( ) ;
146+ assert ! ( nanos <= u64 :: MAX as u128 ) ;
147+
148+ sleep_with (
149+ nanos as u64 ,
150+ wasi:: CLOCKID_MONOTONIC ,
151+ wasi:: SUBCLOCKFLAGS_SUBSCRIPTION_CLOCK_ABSTIME ,
152+ ) ;
170153 }
171154
172155 pub fn join ( self ) {
@@ -186,6 +169,32 @@ impl Thread {
186169 }
187170}
188171
172+ fn sleep_with ( nanos : u64 , clock_id : wasi:: Clockid , flags : u16 ) {
173+ let clock = wasi:: SubscriptionClock { id : clock_id, timeout : nanos, precision : 0 , flags } ;
174+
175+ const USERDATA : wasi:: Userdata = 0x0123_45678 ;
176+ let in_ = wasi:: Subscription {
177+ userdata : USERDATA ,
178+ u : wasi:: SubscriptionU { tag : 0 , u : wasi:: SubscriptionUU { clock } } ,
179+ } ;
180+ unsafe {
181+ let mut event: wasi:: Event = mem:: zeroed ( ) ;
182+ let res = wasi:: poll_oneoff ( & in_, & mut event, 1 ) ;
183+ match ( res, event) {
184+ (
185+ Ok ( 1 ) ,
186+ wasi:: Event {
187+ userdata : USERDATA ,
188+ error : wasi:: ERRNO_SUCCESS ,
189+ type_ : wasi:: EVENTTYPE_CLOCK ,
190+ ..
191+ } ,
192+ ) => { }
193+ _ => panic ! ( "thread::sleep(): unexpected result of poll_oneoff" ) ,
194+ }
195+ }
196+ }
197+
189198pub fn available_parallelism ( ) -> io:: Result < NonZeroUsize > {
190199 unsupported ( )
191200}
0 commit comments