use std::io;
use std::os::windows::io::{AsRawHandle, RawHandle};
use std::process::Child;
use winapi::shared::winerror::WAIT_TIMEOUT;
use winapi::um::synchapi::WaitForSingleObject;
use winapi::um::winbase::{INFINITE, WAIT_OBJECT_0};
use winapi::um::winnt::HANDLE;
pub struct Handle(RawHandle);
pub fn get_handle(child: &Child) -> Handle {
Handle(child.as_raw_handle())
}
pub fn wait_without_reaping(handle: Handle) -> io::Result<()> {
let wait_ret = unsafe { WaitForSingleObject(handle.0 as HANDLE, INFINITE) };
if wait_ret != WAIT_OBJECT_0 {
Err(io::Error::last_os_error())
} else {
Ok(())
}
}
pub fn try_wait_without_reaping(handle: Handle) -> io::Result<bool> {
let wait_ret = unsafe { WaitForSingleObject(handle.0 as HANDLE, 0) };
if wait_ret == WAIT_OBJECT_0 {
Ok(true)
} else if wait_ret == WAIT_TIMEOUT {
Ok(false)
} else {
Err(io::Error::last_os_error())
}
}