| use super::*; |
| |
| #[doc(hidden)] |
| pub struct Waiter(isize); |
| pub struct WaiterSignaler(isize); |
| |
| impl Waiter { |
| pub fn new() -> crate::Result<(Waiter, WaiterSignaler)> { |
| unsafe { |
| let handle = CreateEventW(std::ptr::null(), 1, 0, std::ptr::null()); |
| if handle == 0 { |
| Err(crate::Error::from_win32()) |
| } else { |
| Ok((Waiter(handle), WaiterSignaler(handle))) |
| } |
| } |
| } |
| } |
| |
| impl WaiterSignaler { |
| /// # Safety |
| /// Signals the `Waiter`. This is unsafe because the lifetime of `WaiterSignaler` is not tied |
| /// to the lifetime of the `Waiter`. This is not possible in this case because the `Waiter` |
| /// is used to signal a WinRT async completion and the compiler doesn't know that the lifetime |
| /// of the delegate is bounded by the calling function. |
| pub unsafe fn signal(&self) { |
| // https://github.com/microsoft/windows-rs/pull/374#discussion_r535313344 |
| SetEvent(self.0); |
| } |
| } |
| |
| impl Drop for Waiter { |
| fn drop(&mut self) { |
| unsafe { |
| WaitForSingleObject(self.0, 0xFFFFFFFF); |
| CloseHandle(self.0); |
| } |
| } |
| } |