summaryrefslogtreecommitdiff
path: root/src/thread_parker/windows/keyed_event.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/thread_parker/windows/keyed_event.rs')
-rw-r--r--src/thread_parker/windows/keyed_event.rs78
1 files changed, 31 insertions, 47 deletions
diff --git a/src/thread_parker/windows/keyed_event.rs b/src/thread_parker/windows/keyed_event.rs
index 7c37153..bbe45a4 100644
--- a/src/thread_parker/windows/keyed_event.rs
+++ b/src/thread_parker/windows/keyed_event.rs
@@ -6,24 +6,18 @@
// copied, modified, or distributed except according to those terms.
use core::{
+ ffi,
mem::{self, MaybeUninit},
ptr,
};
-use instant::Instant;
use std::sync::atomic::{AtomicUsize, Ordering};
-use winapi::{
- shared::{
- minwindef::{TRUE, ULONG},
- ntdef::NTSTATUS,
- ntstatus::{STATUS_SUCCESS, STATUS_TIMEOUT},
- },
- um::{
- handleapi::CloseHandle,
- libloaderapi::{GetModuleHandleA, GetProcAddress},
- winnt::{
- ACCESS_MASK, BOOLEAN, GENERIC_READ, GENERIC_WRITE, HANDLE, LARGE_INTEGER, LPCSTR,
- PHANDLE, PLARGE_INTEGER, PVOID,
- },
+use std::time::Instant;
+
+use windows_sys::Win32::{
+ Foundation::{CloseHandle, BOOLEAN, HANDLE, NTSTATUS, STATUS_SUCCESS, STATUS_TIMEOUT},
+ System::{
+ LibraryLoader::{GetModuleHandleA, GetProcAddress},
+ SystemServices::{GENERIC_READ, GENERIC_WRITE},
},
};
@@ -36,58 +30,49 @@ pub struct KeyedEvent {
handle: HANDLE,
NtReleaseKeyedEvent: extern "system" fn(
EventHandle: HANDLE,
- Key: PVOID,
+ Key: *mut ffi::c_void,
Alertable: BOOLEAN,
- Timeout: PLARGE_INTEGER,
+ Timeout: *mut i64,
) -> NTSTATUS,
NtWaitForKeyedEvent: extern "system" fn(
EventHandle: HANDLE,
- Key: PVOID,
+ Key: *mut ffi::c_void,
Alertable: BOOLEAN,
- Timeout: PLARGE_INTEGER,
+ Timeout: *mut i64,
) -> NTSTATUS,
}
impl KeyedEvent {
#[inline]
- unsafe fn wait_for(&self, key: PVOID, timeout: PLARGE_INTEGER) -> NTSTATUS {
- (self.NtWaitForKeyedEvent)(self.handle, key, 0, timeout)
+ unsafe fn wait_for(&self, key: *mut ffi::c_void, timeout: *mut i64) -> NTSTATUS {
+ (self.NtWaitForKeyedEvent)(self.handle, key, false.into(), timeout)
}
#[inline]
- unsafe fn release(&self, key: PVOID) -> NTSTATUS {
- (self.NtReleaseKeyedEvent)(self.handle, key, 0, ptr::null_mut())
+ unsafe fn release(&self, key: *mut ffi::c_void) -> NTSTATUS {
+ (self.NtReleaseKeyedEvent)(self.handle, key, false.into(), ptr::null_mut())
}
#[allow(non_snake_case)]
pub fn create() -> Option<KeyedEvent> {
unsafe {
- let ntdll = GetModuleHandleA(b"ntdll.dll\0".as_ptr() as LPCSTR);
- if ntdll.is_null() {
+ let ntdll = GetModuleHandleA(b"ntdll.dll\0".as_ptr());
+ if ntdll == 0 {
return None;
}
let NtCreateKeyedEvent =
- GetProcAddress(ntdll, b"NtCreateKeyedEvent\0".as_ptr() as LPCSTR);
- if NtCreateKeyedEvent.is_null() {
- return None;
- }
+ GetProcAddress(ntdll, b"NtCreateKeyedEvent\0".as_ptr())?;
let NtReleaseKeyedEvent =
- GetProcAddress(ntdll, b"NtReleaseKeyedEvent\0".as_ptr() as LPCSTR);
- if NtReleaseKeyedEvent.is_null() {
- return None;
- }
+ GetProcAddress(ntdll, b"NtReleaseKeyedEvent\0".as_ptr())?;
let NtWaitForKeyedEvent =
- GetProcAddress(ntdll, b"NtWaitForKeyedEvent\0".as_ptr() as LPCSTR);
- if NtWaitForKeyedEvent.is_null() {
- return None;
- }
+ GetProcAddress(ntdll, b"NtWaitForKeyedEvent\0".as_ptr())?;
let NtCreateKeyedEvent: extern "system" fn(
- KeyedEventHandle: PHANDLE,
- DesiredAccess: ACCESS_MASK,
- ObjectAttributes: PVOID,
- Flags: ULONG,
+ KeyedEventHandle: *mut HANDLE,
+ DesiredAccess: u32,
+ ObjectAttributes: *mut ffi::c_void,
+ Flags: u32,
) -> NTSTATUS = mem::transmute(NtCreateKeyedEvent);
let mut handle = MaybeUninit::uninit();
let status = NtCreateKeyedEvent(
@@ -120,7 +105,7 @@ impl KeyedEvent {
#[inline]
pub unsafe fn park(&'static self, key: &AtomicUsize) {
- let status = self.wait_for(key as *const _ as PVOID, ptr::null_mut());
+ let status = self.wait_for(key as *const _ as *mut ffi::c_void, ptr::null_mut());
debug_assert_eq!(status, STATUS_SUCCESS);
}
@@ -140,14 +125,13 @@ impl KeyedEvent {
// NT uses a timeout in units of 100ns. We use a negative value to
// indicate a relative timeout based on a monotonic clock.
- let mut nt_timeout: LARGE_INTEGER = mem::zeroed();
let diff = timeout - now;
let value = (diff.as_secs() as i64)
.checked_mul(-10000000)
.and_then(|x| x.checked_sub((diff.subsec_nanos() as i64 + 99) / 100));
- match value {
- Some(x) => *nt_timeout.QuadPart_mut() = x,
+ let mut nt_timeout = match value {
+ Some(x) => x,
None => {
// Timeout overflowed, just sleep indefinitely
self.park(key);
@@ -155,7 +139,7 @@ impl KeyedEvent {
}
};
- let status = self.wait_for(key as *const _ as PVOID, &mut nt_timeout);
+ let status = self.wait_for(key as *const _ as *mut ffi::c_void, &mut nt_timeout);
if status == STATUS_SUCCESS {
return true;
}
@@ -192,7 +176,7 @@ impl Drop for KeyedEvent {
fn drop(&mut self) {
unsafe {
let ok = CloseHandle(self.handle);
- debug_assert_eq!(ok, TRUE);
+ debug_assert_eq!(ok, true.into());
}
}
}
@@ -211,7 +195,7 @@ impl UnparkHandle {
#[inline]
pub unsafe fn unpark(self) {
if !self.key.is_null() {
- let status = self.keyed_event.release(self.key as PVOID);
+ let status = self.keyed_event.release(self.key as *mut ffi::c_void);
debug_assert_eq!(status, STATUS_SUCCESS);
}
}