Rollup merge of #129754 - alexcrichton:fix-wasi-long-sleep, r=working… · patricklam/verify-rust-std@ae18edf (original) (raw)
`@@ -136,36 +136,37 @@ impl Thread {
`
136
136
`}
`
137
137
``
138
138
`pub fn sleep(dur: Duration) {
`
139
``
`-
let nanos = dur.as_nanos();
`
140
``
`-
assert!(nanos <= u64::MAX as u128);
`
141
``
-
142
``
`-
const USERDATA: wasi::Userdata = 0x0123_45678;
`
143
``
-
144
``
`-
let clock = wasi::SubscriptionClock {
`
145
``
`-
id: wasi::CLOCKID_MONOTONIC,
`
146
``
`-
timeout: nanos as u64,
`
147
``
`-
precision: 0,
`
148
``
`-
flags: 0,
`
149
``
`-
};
`
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"),
`
``
139
`+
let mut nanos = dur.as_nanos();
`
``
140
`+
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
`+
}
`
169
170
`}
`
170
171
`}
`
171
172
`}
`