| #![doc = include_str!("../README.md")] |
| #![cfg(windows)] |
| #![deny(missing_docs)] |
| #![allow(bad_style)] |
| #![doc(html_root_url = "https://docs.rs/miow/latest/")] |
| |
| use std::cmp; |
| use std::io; |
| use std::time::Duration; |
| |
| use windows_sys::Win32::Foundation::BOOL; |
| use windows_sys::Win32::System::Threading::INFINITE; |
| |
| #[cfg(test)] |
| macro_rules! t { |
| ($e:expr) => { |
| match $e { |
| Ok(e) => e, |
| Err(e) => panic!("{} failed with {:?}", stringify!($e), e), |
| } |
| }; |
| } |
| |
| mod handle; |
| mod overlapped; |
| |
| pub mod iocp; |
| pub mod net; |
| pub mod pipe; |
| |
| pub use crate::overlapped::Overlapped; |
| pub(crate) const TRUE: BOOL = 1; |
| pub(crate) const FALSE: BOOL = 0; |
| |
| fn cvt(i: BOOL) -> io::Result<BOOL> { |
| if i == 0 { |
| Err(io::Error::last_os_error()) |
| } else { |
| Ok(i) |
| } |
| } |
| |
| fn dur2ms(dur: Option<Duration>) -> u32 { |
| let dur = match dur { |
| Some(dur) => dur, |
| None => return INFINITE, |
| }; |
| let ms = dur.as_secs().checked_mul(1_000); |
| let ms_extra = dur.subsec_nanos() / 1_000_000; |
| ms.and_then(|ms| ms.checked_add(ms_extra as u64)) |
| .map(|ms| cmp::min(u32::max_value() as u64, ms) as u32) |
| .unwrap_or(INFINITE - 1) |
| } |