use std::io;
use std::os::windows::io::{AsHandle, AsRawHandle, FromRawHandle, OwnedHandle};
use std::sync::Arc;
use std::sync::atomic::{AtomicUsize, Ordering};
use std::time::Duration;
use windows_sys::Win32::Foundation::{WAIT_OBJECT_0, WAIT_TIMEOUT};
use windows_sys::Win32::System::Threading::{CreateMutexW, WaitForSingleObject};
use crate::{Event, ResetMode};
pub const BOUND: Duration = Duration::from_secs(5);
pub fn auto(signalled: bool) -> Event {
Event::new(ResetMode::Auto, signalled).expect("an event")
}
pub fn manual(signalled: bool) -> Event {
Event::new(ResetMode::Manual, signalled).expect("an event")
}
pub fn is_signalled(object: &impl AsHandle) -> bool {
match unsafe { WaitForSingleObject(object.as_handle().as_raw_handle(), 0) } {
WAIT_OBJECT_0 => true,
WAIT_TIMEOUT => false,
other => panic!("WaitForSingleObject returned {other:#x}"),
}
}
pub fn abandoned_mutex() -> OwnedHandle {
std::thread::spawn(|| {
let raw = unsafe { CreateMutexW(std::ptr::null(), 1, std::ptr::null()) };
assert!(
!raw.is_null(),
"CreateMutexW: {}",
io::Error::last_os_error()
);
unsafe { OwnedHandle::from_raw_handle(raw) }
})
.join()
.expect("the owning thread")
}
pub struct DropCount(pub Arc<AtomicUsize>);
impl Drop for DropCount {
fn drop(&mut self) {
self.0.fetch_add(1, Ordering::SeqCst);
}
}