@@ -3,7 +3,7 @@ use crate::io;
3
3
use crate :: mem;
4
4
use crate :: num:: NonZeroUsize ;
5
5
use crate :: sys:: unsupported;
6
- use crate :: time:: Duration ;
6
+ use crate :: time:: { Duration , Instant } ;
7
7
8
8
cfg_if:: cfg_if! {
9
9
if #[ cfg( target_feature = "atomics" ) ] {
@@ -138,35 +138,18 @@ impl Thread {
138
138
let nanos = dur. as_nanos ( ) ;
139
139
assert ! ( nanos <= u64 :: MAX as u128 ) ;
140
140
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
+ ) ;
170
153
}
171
154
172
155
pub fn join ( self ) {
@@ -186,6 +169,32 @@ impl Thread {
186
169
}
187
170
}
188
171
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
+
189
198
pub fn available_parallelism ( ) -> io:: Result < NonZeroUsize > {
190
199
unsupported ( )
191
200
}
0 commit comments