use std::io;
use std::os::windows::io::{AsRawHandle as _, FromRawHandle as _, OwnedHandle};
use super::ffi;
use crate::waker::WakeSignal;
#[derive(Debug)]
pub(super) struct WakeEvent {
event: OwnedHandle,
}
impl WakeEvent {
pub(super) fn new() -> io::Result<Self> {
let event = unsafe { ffi::CreateEventW(core::ptr::null(), 0, 0, core::ptr::null()) };
if event.is_null() {
return Err(io::Error::last_os_error());
}
let event = unsafe { OwnedHandle::from_raw_handle(event) };
Ok(Self { event })
}
pub(super) fn handle(&self) -> ffi::Handle {
self.event.as_raw_handle()
}
}
impl WakeSignal for WakeEvent {
fn wake(&self) {
if unsafe { ffi::SetEvent(self.handle()) } == 0 {
crcbl_core::log::warn!(
"SetEvent on the shell's wake event failed: {}",
io::Error::last_os_error()
);
}
}
}