33use crate :: ffi:: CStr ;
44use crate :: num:: NonZero ;
55use crate :: sys:: unsupported;
6- use crate :: time:: Duration ;
6+ use crate :: time:: { Duration , Instant } ;
77use crate :: { io, mem} ;
88
99cfg_if:: cfg_if! {
@@ -136,41 +136,25 @@ impl Thread {
136136 }
137137
138138 pub fn sleep ( dur : Duration ) {
139- let mut nanos = dur. as_nanos ( ) ;
139+ let mut nanos_all = dur. as_nanos ( ) ;
140140 while nanos > 0 {
141- const USERDATA : wasi:: Userdata = 0x0123_45678 ;
142-
143- let clock = wasi:: SubscriptionClock {
144- id : wasi:: CLOCKID_MONOTONIC ,
145- timeout : u64:: try_from ( nanos) . unwrap_or ( u64:: MAX ) ,
146- precision : 0 ,
147- flags : 0 ,
148- } ;
149- nanos -= u128:: from ( clock. timeout ) ;
150-
151- let in_ = wasi:: Subscription {
152- userdata : USERDATA ,
153- u : wasi:: SubscriptionU { tag : 0 , u : wasi:: SubscriptionUU { clock } } ,
154- } ;
155- unsafe {
156- let mut event: wasi:: Event = mem:: zeroed ( ) ;
157- let res = wasi:: poll_oneoff ( & in_, & mut event, 1 ) ;
158- match ( res, event) {
159- (
160- Ok ( 1 ) ,
161- wasi:: Event {
162- userdata : USERDATA ,
163- error : wasi:: ERRNO_SUCCESS ,
164- type_ : wasi:: EVENTTYPE_CLOCK ,
165- ..
166- } ,
167- ) => { }
168- _ => panic ! ( "thread::sleep(): unexpected result of poll_oneoff" ) ,
169- }
170- }
141+ let nanos_sleepable = u64:: try_from ( full_nanos) . unwrap_or ( u64:: MAX ) ;
142+ nanos_all -= u128:: from ( nanos_sleepable) ;
143+ sleep_with ( nanos_sleepable, wasi:: CLOCKID_MONOTONIC , 0 ) ;
171144 }
172145 }
173146
147+ pub fn sleep_until ( deadline : Instant ) {
148+ let nanos = deadline. into_inner ( ) . into_inner ( ) . as_nanos ( ) ;
149+ assert ! ( nanos <= u64 :: MAX as u128 ) ;
150+
151+ sleep_with (
152+ nanos as u64 ,
153+ wasi:: CLOCKID_MONOTONIC ,
154+ wasi:: SUBCLOCKFLAGS_SUBSCRIPTION_CLOCK_ABSTIME ,
155+ ) ;
156+ }
157+
174158 pub fn join ( self ) {
175159 cfg_if:: cfg_if! {
176160 if #[ cfg( target_feature = "atomics" ) ] {
@@ -186,6 +170,33 @@ impl Thread {
186170 }
187171}
188172
189- pub fn available_parallelism ( ) -> io:: Result < NonZero < usize > > {
173+ fn sleep_with ( nanos : u64 , clock_id : wasi:: Clockid , flags : u16 ) {
174+ const USERDATA : wasi:: Userdata = 0x0123_45678 ;
175+
176+ let clock = wasi:: SubscriptionClock { id : clock_id, timeout : nanos, precision : 0 , flags } ;
177+
178+ let in_ = wasi:: Subscription {
179+ userdata : USERDATA ,
180+ u : wasi:: SubscriptionU { tag : 0 , u : wasi:: SubscriptionUU { clock } } ,
181+ } ;
182+ unsafe {
183+ let mut event: wasi:: Event = mem:: zeroed ( ) ;
184+ let res = wasi:: poll_oneoff ( & in_, & mut event, 1 ) ;
185+ match ( res, event) {
186+ (
187+ Ok ( 1 ) ,
188+ wasi:: Event {
189+ userdata : USERDATA ,
190+ error : wasi:: ERRNO_SUCCESS ,
191+ type_ : wasi:: EVENTTYPE_CLOCK ,
192+ ..
193+ } ,
194+ ) => { }
195+ _ => panic ! ( "thread::sleep(): unexpected result of poll_oneoff" ) ,
196+ }
197+ }
198+ }
199+
200+ pub fn available_parallelism ( ) -> io:: Result < NonZeroUsize > {
190201 unsupported ( )
191202}
0 commit comments