diff options
Diffstat (limited to 'src/thread_parker')
-rw-r--r-- | src/thread_parker/generic.rs | 2 | ||||
-rw-r--r-- | src/thread_parker/linux.rs | 8 | ||||
-rw-r--r-- | src/thread_parker/unix.rs | 14 | ||||
-rw-r--r-- | src/thread_parker/windows/keyed_event.rs | 66 | ||||
-rw-r--r-- | src/thread_parker/windows/waitaddress.rs | 29 |
5 files changed, 62 insertions, 57 deletions
diff --git a/src/thread_parker/generic.rs b/src/thread_parker/generic.rs index 990bcb7..93c94fa 100644 --- a/src/thread_parker/generic.rs +++ b/src/thread_parker/generic.rs @@ -8,8 +8,8 @@ //! A simple spin lock based thread parker. Used on platforms without better //! parking facilities available. -use core::sync::atomic::{AtomicBool, Ordering}; use core::hint::spin_loop; +use core::sync::atomic::{AtomicBool, Ordering}; use std::thread; use std::time::Instant; diff --git a/src/thread_parker/linux.rs b/src/thread_parker/linux.rs index 5d4e229..92601f6 100644 --- a/src/thread_parker/linux.rs +++ b/src/thread_parker/linux.rs @@ -80,10 +80,10 @@ impl super::ThreadParkerT for ThreadParker { self.park(); return true; } - let ts = libc::timespec { - tv_sec: diff.as_secs() as libc::time_t, - tv_nsec: diff.subsec_nanos() as tv_nsec_t, - }; + // SAFETY: libc::timespec is zero initializable. + let mut ts: libc::timespec = std::mem::zeroed(); + ts.tv_sec = diff.as_secs() as libc::time_t; + ts.tv_nsec = diff.subsec_nanos() as tv_nsec_t; self.futex_wait(Some(ts)); } true diff --git a/src/thread_parker/unix.rs b/src/thread_parker/unix.rs index c52ead9..88b6df8 100644 --- a/src/thread_parker/unix.rs +++ b/src/thread_parker/unix.rs @@ -127,12 +127,22 @@ impl super::ThreadParkerT for ThreadParker { impl ThreadParker { /// Initializes the condvar to use CLOCK_MONOTONIC instead of CLOCK_REALTIME. - #[cfg(any(target_os = "macos", target_os = "ios", target_os = "android"))] + #[cfg(any( + target_os = "macos", + target_os = "ios", + target_os = "android", + target_os = "espidf" + ))] #[inline] unsafe fn init(&self) {} /// Initializes the condvar to use CLOCK_MONOTONIC instead of CLOCK_REALTIME. - #[cfg(not(any(target_os = "macos", target_os = "ios", target_os = "android")))] + #[cfg(not(any( + target_os = "macos", + target_os = "ios", + target_os = "android", + target_os = "espidf" + )))] #[inline] unsafe fn init(&self) { let mut attr = MaybeUninit::<libc::pthread_condattr_t>::uninit(); diff --git a/src/thread_parker/windows/keyed_event.rs b/src/thread_parker/windows/keyed_event.rs index bbe45a4..302bab5 100644 --- a/src/thread_parker/windows/keyed_event.rs +++ b/src/thread_parker/windows/keyed_event.rs @@ -55,42 +55,40 @@ impl KeyedEvent { #[allow(non_snake_case)] pub fn create() -> Option<KeyedEvent> { - unsafe { - let ntdll = GetModuleHandleA(b"ntdll.dll\0".as_ptr()); - if ntdll == 0 { - return None; - } - - let NtCreateKeyedEvent = - GetProcAddress(ntdll, b"NtCreateKeyedEvent\0".as_ptr())?; - let NtReleaseKeyedEvent = - GetProcAddress(ntdll, b"NtReleaseKeyedEvent\0".as_ptr())?; - let NtWaitForKeyedEvent = - GetProcAddress(ntdll, b"NtWaitForKeyedEvent\0".as_ptr())?; - - let NtCreateKeyedEvent: extern "system" fn( - KeyedEventHandle: *mut HANDLE, - DesiredAccess: u32, - ObjectAttributes: *mut ffi::c_void, - Flags: u32, - ) -> NTSTATUS = mem::transmute(NtCreateKeyedEvent); - let mut handle = MaybeUninit::uninit(); - let status = NtCreateKeyedEvent( - handle.as_mut_ptr(), - GENERIC_READ | GENERIC_WRITE, - ptr::null_mut(), - 0, - ); - if status != STATUS_SUCCESS { - return None; - } + let ntdll = unsafe { GetModuleHandleA(b"ntdll.dll\0".as_ptr()) }; + if ntdll == 0 { + return None; + } - Some(KeyedEvent { - handle: handle.assume_init(), - NtReleaseKeyedEvent: mem::transmute(NtReleaseKeyedEvent), - NtWaitForKeyedEvent: mem::transmute(NtWaitForKeyedEvent), - }) + let NtCreateKeyedEvent = + unsafe { GetProcAddress(ntdll, b"NtCreateKeyedEvent\0".as_ptr())? }; + let NtReleaseKeyedEvent = + unsafe { GetProcAddress(ntdll, b"NtReleaseKeyedEvent\0".as_ptr())? }; + let NtWaitForKeyedEvent = + unsafe { GetProcAddress(ntdll, b"NtWaitForKeyedEvent\0".as_ptr())? }; + + let NtCreateKeyedEvent: extern "system" fn( + KeyedEventHandle: *mut HANDLE, + DesiredAccess: u32, + ObjectAttributes: *mut ffi::c_void, + Flags: u32, + ) -> NTSTATUS = unsafe { mem::transmute(NtCreateKeyedEvent) }; + let mut handle = MaybeUninit::uninit(); + let status = NtCreateKeyedEvent( + handle.as_mut_ptr(), + GENERIC_READ | GENERIC_WRITE, + ptr::null_mut(), + 0, + ); + if status != STATUS_SUCCESS { + return None; } + + Some(KeyedEvent { + handle: unsafe { handle.assume_init() }, + NtReleaseKeyedEvent: unsafe { mem::transmute(NtReleaseKeyedEvent) }, + NtWaitForKeyedEvent: unsafe { mem::transmute(NtWaitForKeyedEvent) }, + }) } #[inline] diff --git a/src/thread_parker/windows/waitaddress.rs b/src/thread_parker/windows/waitaddress.rs index dde0db7..ef6cb44 100644 --- a/src/thread_parker/windows/waitaddress.rs +++ b/src/thread_parker/windows/waitaddress.rs @@ -32,24 +32,21 @@ pub struct WaitAddress { impl WaitAddress { #[allow(non_snake_case)] pub fn create() -> Option<WaitAddress> { - unsafe { - // 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()); - if synch_dll == 0 { - return None; - } + // 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; + } - let WaitOnAddress = GetProcAddress(synch_dll, b"WaitOnAddress\0".as_ptr())?; - let WakeByAddressSingle = - GetProcAddress(synch_dll, b"WakeByAddressSingle\0".as_ptr())?; + let WaitOnAddress = unsafe { GetProcAddress(synch_dll, b"WaitOnAddress\0".as_ptr())? }; + let WakeByAddressSingle = + unsafe { GetProcAddress(synch_dll, b"WakeByAddressSingle\0".as_ptr())? }; - Some(WaitAddress { - WaitOnAddress: mem::transmute(WaitOnAddress), - WakeByAddressSingle: mem::transmute(WakeByAddressSingle), - }) - } + Some(WaitAddress { + WaitOnAddress: unsafe { mem::transmute(WaitOnAddress) }, + WakeByAddressSingle: unsafe { mem::transmute(WakeByAddressSingle) }, + }) } #[inline] |