|
1 | 1 | //! Wait for events to trigger on specific file descriptors |
2 | 2 | use std::os::unix::io::{AsFd, AsRawFd, BorrowedFd}; |
3 | | -use std::time::Duration; |
4 | 3 |
|
5 | 4 | use crate::errno::Errno; |
| 5 | +pub use crate::poll_timeout::PollTimeout; |
6 | 6 | use crate::Result; |
| 7 | + |
7 | 8 | /// This is a wrapper around `libc::pollfd`. |
8 | 9 | /// |
9 | 10 | /// It's meant to be used as an argument to the [`poll`](fn.poll.html) and |
@@ -175,229 +176,6 @@ libc_bitflags! { |
175 | 176 | } |
176 | 177 | } |
177 | 178 |
|
178 | | -/// Timeout argument for [`poll`]. |
179 | | -#[derive(Debug, Clone, Copy, Eq, PartialEq, Ord, PartialOrd)] |
180 | | -pub struct PollTimeout(i32); |
181 | | - |
182 | | -impl PollTimeout { |
183 | | - /// Blocks indefinitely. |
184 | | - /// |
185 | | - /// > Specifying a negative value in timeout means an infinite timeout. |
186 | | - pub const NONE: Self = Self(-1); |
187 | | - /// Returns immediately. |
188 | | - /// |
189 | | - /// > Specifying a timeout of zero causes poll() to return immediately, even if no file |
190 | | - /// > descriptors are ready. |
191 | | - pub const ZERO: Self = Self(0); |
192 | | - /// Blocks for at most [`std::i32::MAX`] milliseconds. |
193 | | - pub const MAX: Self = Self(i32::MAX); |
194 | | - /// Returns if `self` equals [`PollTimeout::NONE`]. |
195 | | - pub fn is_none(&self) -> bool { |
196 | | - // > Specifying a negative value in timeout means an infinite timeout. |
197 | | - *self <= Self::NONE |
198 | | - } |
199 | | - /// Returns if `self` does not equal [`PollTimeout::NONE`]. |
200 | | - pub fn is_some(&self) -> bool { |
201 | | - !self.is_none() |
202 | | - } |
203 | | - /// Returns the timeout in milliseconds if there is some, otherwise returns `None`. |
204 | | - pub fn as_millis(&self) -> Option<u32> { |
205 | | - self.is_some().then_some(u32::try_from(self.0).unwrap()) |
206 | | - } |
207 | | - /// Returns the timeout as a `Duration` if there is some, otherwise returns `None`. |
208 | | - pub fn timeout(&self) -> Option<Duration> { |
209 | | - self.as_millis() |
210 | | - .map(|x| Duration::from_millis(u64::from(x))) |
211 | | - } |
212 | | -} |
213 | | - |
214 | | -/// Error type for integer conversions into `PollTimeout`. |
215 | | -#[derive(Debug, Clone, Copy, PartialEq, Eq)] |
216 | | -pub enum PollTimeoutTryFromError { |
217 | | - /// Passing a value less than -1 is invalid on some systems, see |
218 | | - /// <https://man.freebsd.org/cgi/man.cgi?poll#end>. |
219 | | - TooNegative, |
220 | | - /// Passing a value greater than `i32::MAX` is invalid. |
221 | | - TooPositive, |
222 | | -} |
223 | | - |
224 | | -impl std::fmt::Display for PollTimeoutTryFromError { |
225 | | - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { |
226 | | - match self { |
227 | | - Self::TooNegative => write!(f, "Passed a negative timeout less than -1."), |
228 | | - Self::TooPositive => write!(f, "Passed a positive timeout greater than `i32::MAX` milliseconds.") |
229 | | - } |
230 | | - } |
231 | | -} |
232 | | - |
233 | | -impl std::error::Error for PollTimeoutTryFromError {} |
234 | | - |
235 | | -impl<T: Into<PollTimeout>> From<Option<T>> for PollTimeout { |
236 | | - fn from(x: Option<T>) -> Self { |
237 | | - x.map_or(Self::NONE, |x| x.into()) |
238 | | - } |
239 | | -} |
240 | | -impl TryFrom<Duration> for PollTimeout { |
241 | | - type Error = PollTimeoutTryFromError; |
242 | | - fn try_from(x: Duration) -> std::result::Result<Self, Self::Error> { |
243 | | - Ok(Self( |
244 | | - i32::try_from(x.as_millis()) |
245 | | - .map_err(|_| PollTimeoutTryFromError::TooPositive)?, |
246 | | - )) |
247 | | - } |
248 | | -} |
249 | | -impl TryFrom<u128> for PollTimeout { |
250 | | - type Error = PollTimeoutTryFromError; |
251 | | - fn try_from(x: u128) -> std::result::Result<Self, Self::Error> { |
252 | | - Ok(Self( |
253 | | - i32::try_from(x) |
254 | | - .map_err(|_| PollTimeoutTryFromError::TooPositive)?, |
255 | | - )) |
256 | | - } |
257 | | -} |
258 | | -impl TryFrom<u64> for PollTimeout { |
259 | | - type Error = PollTimeoutTryFromError; |
260 | | - fn try_from(x: u64) -> std::result::Result<Self, Self::Error> { |
261 | | - Ok(Self( |
262 | | - i32::try_from(x) |
263 | | - .map_err(|_| PollTimeoutTryFromError::TooPositive)?, |
264 | | - )) |
265 | | - } |
266 | | -} |
267 | | -impl TryFrom<u32> for PollTimeout { |
268 | | - type Error = PollTimeoutTryFromError; |
269 | | - fn try_from(x: u32) -> std::result::Result<Self, Self::Error> { |
270 | | - Ok(Self( |
271 | | - i32::try_from(x) |
272 | | - .map_err(|_| PollTimeoutTryFromError::TooPositive)?, |
273 | | - )) |
274 | | - } |
275 | | -} |
276 | | -impl From<u16> for PollTimeout { |
277 | | - fn from(x: u16) -> Self { |
278 | | - Self(i32::from(x)) |
279 | | - } |
280 | | -} |
281 | | -impl From<u8> for PollTimeout { |
282 | | - fn from(x: u8) -> Self { |
283 | | - Self(i32::from(x)) |
284 | | - } |
285 | | -} |
286 | | -impl TryFrom<i128> for PollTimeout { |
287 | | - type Error = PollTimeoutTryFromError; |
288 | | - fn try_from(x: i128) -> std::result::Result<Self, Self::Error> { |
289 | | - match x { |
290 | | - ..=-2 => Err(PollTimeoutTryFromError::TooNegative), |
291 | | - -1.. => Ok(Self( |
292 | | - i32::try_from(x) |
293 | | - .map_err(|_| PollTimeoutTryFromError::TooPositive)?, |
294 | | - )), |
295 | | - } |
296 | | - } |
297 | | -} |
298 | | -impl TryFrom<i64> for PollTimeout { |
299 | | - type Error = PollTimeoutTryFromError; |
300 | | - fn try_from(x: i64) -> std::result::Result<Self, Self::Error> { |
301 | | - match x { |
302 | | - ..=-2 => Err(PollTimeoutTryFromError::TooNegative), |
303 | | - -1.. => Ok(Self( |
304 | | - i32::try_from(x) |
305 | | - .map_err(|_| PollTimeoutTryFromError::TooPositive)?, |
306 | | - )), |
307 | | - } |
308 | | - } |
309 | | -} |
310 | | -impl TryFrom<i32> for PollTimeout { |
311 | | - type Error = PollTimeoutTryFromError; |
312 | | - fn try_from(x: i32) -> std::result::Result<Self, Self::Error> { |
313 | | - match x { |
314 | | - ..=-2 => Err(PollTimeoutTryFromError::TooNegative), |
315 | | - -1.. => Ok(Self(x)), |
316 | | - } |
317 | | - } |
318 | | -} |
319 | | -impl TryFrom<i16> for PollTimeout { |
320 | | - type Error = PollTimeoutTryFromError; |
321 | | - fn try_from(x: i16) -> std::result::Result<Self, Self::Error> { |
322 | | - match x { |
323 | | - ..=-2 => Err(PollTimeoutTryFromError::TooNegative), |
324 | | - -1.. => Ok(Self(i32::from(x))), |
325 | | - } |
326 | | - } |
327 | | -} |
328 | | -impl TryFrom<i8> for PollTimeout { |
329 | | - type Error = PollTimeoutTryFromError; |
330 | | - fn try_from(x: i8) -> std::result::Result<Self, Self::Error> { |
331 | | - match x { |
332 | | - ..=-2 => Err(PollTimeoutTryFromError::TooNegative), |
333 | | - -1.. => Ok(Self(i32::from(x))), |
334 | | - } |
335 | | - } |
336 | | -} |
337 | | -impl TryFrom<PollTimeout> for Duration { |
338 | | - type Error = (); |
339 | | - fn try_from(x: PollTimeout) -> std::result::Result<Self, ()> { |
340 | | - x.timeout().ok_or(()) |
341 | | - } |
342 | | -} |
343 | | -impl TryFrom<PollTimeout> for u128 { |
344 | | - type Error = <Self as TryFrom<i32>>::Error; |
345 | | - fn try_from(x: PollTimeout) -> std::result::Result<Self, Self::Error> { |
346 | | - Self::try_from(x.0) |
347 | | - } |
348 | | -} |
349 | | -impl TryFrom<PollTimeout> for u64 { |
350 | | - type Error = <Self as TryFrom<i32>>::Error; |
351 | | - fn try_from(x: PollTimeout) -> std::result::Result<Self, Self::Error> { |
352 | | - Self::try_from(x.0) |
353 | | - } |
354 | | -} |
355 | | -impl TryFrom<PollTimeout> for u32 { |
356 | | - type Error = <Self as TryFrom<i32>>::Error; |
357 | | - fn try_from(x: PollTimeout) -> std::result::Result<Self, Self::Error> { |
358 | | - Self::try_from(x.0) |
359 | | - } |
360 | | -} |
361 | | -impl TryFrom<PollTimeout> for u16 { |
362 | | - type Error = <Self as TryFrom<i32>>::Error; |
363 | | - fn try_from(x: PollTimeout) -> std::result::Result<Self, Self::Error> { |
364 | | - Self::try_from(x.0) |
365 | | - } |
366 | | -} |
367 | | -impl TryFrom<PollTimeout> for u8 { |
368 | | - type Error = <Self as TryFrom<i32>>::Error; |
369 | | - fn try_from(x: PollTimeout) -> std::result::Result<Self, Self::Error> { |
370 | | - Self::try_from(x.0) |
371 | | - } |
372 | | -} |
373 | | -impl From<PollTimeout> for i128 { |
374 | | - fn from(x: PollTimeout) -> Self { |
375 | | - Self::from(x.0) |
376 | | - } |
377 | | -} |
378 | | -impl From<PollTimeout> for i64 { |
379 | | - fn from(x: PollTimeout) -> Self { |
380 | | - Self::from(x.0) |
381 | | - } |
382 | | -} |
383 | | -impl From<PollTimeout> for i32 { |
384 | | - fn from(x: PollTimeout) -> Self { |
385 | | - x.0 |
386 | | - } |
387 | | -} |
388 | | -impl TryFrom<PollTimeout> for i16 { |
389 | | - type Error = <Self as TryFrom<i32>>::Error; |
390 | | - fn try_from(x: PollTimeout) -> std::result::Result<Self, Self::Error> { |
391 | | - Self::try_from(x.0) |
392 | | - } |
393 | | -} |
394 | | -impl TryFrom<PollTimeout> for i8 { |
395 | | - type Error = <Self as TryFrom<i32>>::Error; |
396 | | - fn try_from(x: PollTimeout) -> std::result::Result<Self, Self::Error> { |
397 | | - Self::try_from(x.0) |
398 | | - } |
399 | | -} |
400 | | - |
401 | 179 | /// `poll` waits for one of a set of file descriptors to become ready to perform I/O. |
402 | 180 | /// ([`poll(2)`](https://pubs.opengroup.org/onlinepubs/9699919799/functions/poll.html)) |
403 | 181 | /// |
|
0 commit comments