iocp_rs/
utils.rs

1use std::{
2    io::{Error, Result},
3    time::Duration,
4};
5use windows_sys::Win32::System::Threading::INFINITE;
6
7pub(crate) fn cvt(ret: i32) -> Result<i32> {
8    if ret == 0 {
9        Err(Error::last_os_error())
10    } else {
11        Ok(ret)
12    }
13}
14
15pub(crate) fn dur_to_ms(timeout: Option<Duration>) -> u32 {
16    let func = |dur: Duration| -> u32 {
17        dur.as_secs()
18            .checked_mul(1000)
19            .and_then(|ms| ms.checked_add((dur.subsec_nanos() as u64) / 1_000_000))
20            .and_then(|ms| {
21                ms.checked_add(if dur.subsec_nanos() % 1_000_000 > 0 {
22                    1
23                } else {
24                    0
25                })
26            })
27            .map(|ms| {
28                if ms > u32::max_value() as u64 {
29                    INFINITE
30                } else {
31                    ms as u32
32                }
33            })
34            .unwrap_or(INFINITE)
35    };
36
37    timeout.map(func).unwrap_or(INFINITE)
38}
39
40pub(crate) fn len<T>(list: &[T]) -> u32 {
41    list.len().min(u32::MAX as usize) as u32
42}