summaryrefslogtreecommitdiff
path: root/src/thread_parker/windows/waitaddress.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/thread_parker/windows/waitaddress.rs')
-rw-r--r--src/thread_parker/windows/waitaddress.rs36
1 files changed, 13 insertions, 23 deletions
diff --git a/src/thread_parker/windows/waitaddress.rs b/src/thread_parker/windows/waitaddress.rs
index ef6cb44..41df45f 100644
--- a/src/thread_parker/windows/waitaddress.rs
+++ b/src/thread_parker/windows/waitaddress.rs
@@ -10,30 +10,18 @@ use core::{
sync::atomic::{AtomicUsize, Ordering},
};
use std::{ffi, time::Instant};
-use windows_sys::Win32::{
- Foundation::{GetLastError, BOOL, ERROR_TIMEOUT},
- System::{
- LibraryLoader::{GetModuleHandleA, GetProcAddress},
- WindowsProgramming::INFINITE,
- },
-};
+
+use super::bindings::*;
#[allow(non_snake_case)]
pub struct WaitAddress {
- WaitOnAddress: extern "system" fn(
- Address: *mut ffi::c_void,
- CompareAddress: *mut ffi::c_void,
- AddressSize: usize,
- dwMilliseconds: u32,
- ) -> BOOL,
- WakeByAddressSingle: extern "system" fn(Address: *mut ffi::c_void),
+ WaitOnAddress: WaitOnAddress,
+ WakeByAddressSingle: WakeByAddressSingle,
}
impl WaitAddress {
#[allow(non_snake_case)]
pub fn create() -> Option<WaitAddress> {
- // MSDN claims that that WaitOnAddress and WakeByAddressSingle are
- // located in kernel32.dll, but they are lying...
let synch_dll = unsafe { GetModuleHandleA(b"api-ms-win-core-synch-l1-2-0.dll\0".as_ptr()) };
if synch_dll == 0 {
return None;
@@ -108,12 +96,14 @@ impl WaitAddress {
#[inline]
fn wait_on_address(&'static self, key: &AtomicUsize, timeout: u32) -> BOOL {
let cmp = 1usize;
- (self.WaitOnAddress)(
- key as *const _ as *mut ffi::c_void,
- &cmp as *const _ as *mut ffi::c_void,
- mem::size_of::<usize>(),
- timeout,
- )
+ unsafe {
+ (self.WaitOnAddress)(
+ key as *const _ as *mut ffi::c_void,
+ &cmp as *const _ as *mut ffi::c_void,
+ mem::size_of::<usize>(),
+ timeout,
+ )
+ }
}
}
@@ -130,6 +120,6 @@ impl UnparkHandle {
// released to avoid blocking the queue for too long.
#[inline]
pub fn unpark(self) {
- (self.waitaddress.WakeByAddressSingle)(self.key as *mut ffi::c_void);
+ unsafe { (self.waitaddress.WakeByAddressSingle)(self.key as *mut ffi::c_void) };
}
}