use fastly_shared::FastlyStatus;
use fastly_sys::fastly_async_io;
use std::time::Duration;
pub(crate) fn is_ready(handle: u32) -> Result<bool, FastlyStatus> {
let mut ready_out = 0_u32;
unsafe { fastly_async_io::is_ready(handle, &mut ready_out) }.result()?;
Ok(ready_out != 0)
}
pub(crate) fn select(handles: &[u32]) -> Result<usize, FastlyStatus> {
Ok(select_timeout(handles, None)?.expect("untimed select returned a timeout"))
}
pub(crate) fn select_timeout(
handles: &[u32],
timeout: Option<Duration>,
) -> Result<Option<usize>, FastlyStatus> {
let timeout_ms = match timeout {
Some(d) => d.as_millis().try_into().unwrap_or(u32::MAX).max(1),
None => 0,
};
let mut done_index = 0_u32;
let status = unsafe {
fastly_async_io::select(handles.as_ptr(), handles.len(), timeout_ms, &mut done_index)
};
status.result()?;
if done_index == u32::MAX {
Ok(None)
} else {
Ok(Some(done_index as usize))
}
}