diff options
Diffstat (limited to 'src/thread_parker/windows/waitaddress.rs')
-rw-r--r-- | src/thread_parker/windows/waitaddress.rs | 61 |
1 files changed, 25 insertions, 36 deletions
diff --git a/src/thread_parker/windows/waitaddress.rs b/src/thread_parker/windows/waitaddress.rs index 862c5c6..dde0db7 100644 --- a/src/thread_parker/windows/waitaddress.rs +++ b/src/thread_parker/windows/waitaddress.rs @@ -9,30 +9,24 @@ use core::{ mem, sync::atomic::{AtomicUsize, Ordering}, }; -use instant::Instant; -use winapi::{ - shared::{ - basetsd::SIZE_T, - minwindef::{BOOL, DWORD, FALSE, TRUE}, - winerror::ERROR_TIMEOUT, - }, - um::{ - errhandlingapi::GetLastError, - libloaderapi::{GetModuleHandleA, GetProcAddress}, - winbase::INFINITE, - winnt::{LPCSTR, PVOID}, +use std::{ffi, time::Instant}; +use windows_sys::Win32::{ + Foundation::{GetLastError, BOOL, ERROR_TIMEOUT}, + System::{ + LibraryLoader::{GetModuleHandleA, GetProcAddress}, + WindowsProgramming::INFINITE, }, }; #[allow(non_snake_case)] pub struct WaitAddress { WaitOnAddress: extern "system" fn( - Address: PVOID, - CompareAddress: PVOID, - AddressSize: SIZE_T, - dwMilliseconds: DWORD, + Address: *mut ffi::c_void, + CompareAddress: *mut ffi::c_void, + AddressSize: usize, + dwMilliseconds: u32, ) -> BOOL, - WakeByAddressSingle: extern "system" fn(Address: PVOID), + WakeByAddressSingle: extern "system" fn(Address: *mut ffi::c_void), } impl WaitAddress { @@ -42,20 +36,15 @@ impl WaitAddress { // MSDN claims that that WaitOnAddress and WakeByAddressSingle are // located in kernel32.dll, but they are lying... let synch_dll = - GetModuleHandleA(b"api-ms-win-core-synch-l1-2-0.dll\0".as_ptr() as LPCSTR); - if synch_dll.is_null() { + GetModuleHandleA(b"api-ms-win-core-synch-l1-2-0.dll\0".as_ptr()); + if synch_dll == 0 { return None; } - let WaitOnAddress = GetProcAddress(synch_dll, b"WaitOnAddress\0".as_ptr() as LPCSTR); - if WaitOnAddress.is_null() { - return None; - } + let WaitOnAddress = GetProcAddress(synch_dll, b"WaitOnAddress\0".as_ptr())?; let WakeByAddressSingle = - GetProcAddress(synch_dll, b"WakeByAddressSingle\0".as_ptr() as LPCSTR); - if WakeByAddressSingle.is_null() { - return None; - } + GetProcAddress(synch_dll, b"WakeByAddressSingle\0".as_ptr())?; + Some(WaitAddress { WaitOnAddress: mem::transmute(WaitOnAddress), WakeByAddressSingle: mem::transmute(WakeByAddressSingle), @@ -77,7 +66,7 @@ impl WaitAddress { pub fn park(&'static self, key: &AtomicUsize) { while key.load(Ordering::Acquire) != 0 { let r = self.wait_on_address(key, INFINITE); - debug_assert!(r == TRUE); + debug_assert!(r == true.into()); } } @@ -94,14 +83,14 @@ impl WaitAddress { .checked_mul(1000) .and_then(|x| x.checked_add((diff.subsec_nanos() as u64 + 999999) / 1000000)) .map(|ms| { - if ms > <DWORD>::max_value() as u64 { + if ms > std::u32::MAX as u64 { INFINITE } else { - ms as DWORD + ms as u32 } }) .unwrap_or(INFINITE); - if self.wait_on_address(key, timeout) == FALSE { + if self.wait_on_address(key, timeout) == false.into() { debug_assert_eq!(unsafe { GetLastError() }, ERROR_TIMEOUT); } } @@ -120,12 +109,12 @@ impl WaitAddress { } #[inline] - fn wait_on_address(&'static self, key: &AtomicUsize, timeout: DWORD) -> BOOL { + fn wait_on_address(&'static self, key: &AtomicUsize, timeout: u32) -> BOOL { let cmp = 1usize; (self.WaitOnAddress)( - key as *const _ as PVOID, - &cmp as *const _ as PVOID, - mem::size_of::<usize>() as SIZE_T, + key as *const _ as *mut ffi::c_void, + &cmp as *const _ as *mut ffi::c_void, + mem::size_of::<usize>(), timeout, ) } @@ -144,6 +133,6 @@ impl UnparkHandle { // released to avoid blocking the queue for too long. #[inline] pub fn unpark(self) { - (self.waitaddress.WakeByAddressSingle)(self.key as PVOID); + (self.waitaddress.WakeByAddressSingle)(self.key as *mut ffi::c_void); } } |