// Licensed under the Apache License, Version 2.0 // or the MIT license // , at your option. // All files in the project carrying such notice may not be copied, modified, or distributed // except according to those terms. //! ApiSet Contract for api-ms-win-core-synch-l1 use shared::basetsd::SIZE_T; use shared::minwindef::{BOOL, DWORD, LPLONG, LPVOID, PBOOL, ULONG}; use um::minwinbase::{ LPCRITICAL_SECTION, LPSECURITY_ATTRIBUTES, PCRITICAL_SECTION, PREASON_CONTEXT, }; use um::winnt::{ BOOLEAN, HANDLE, LARGE_INTEGER, LONG, LPCSTR, LPCWSTR, PRTL_BARRIER, PRTL_RUN_ONCE, PVOID, RTL_BARRIER, RTL_CONDITION_VARIABLE, RTL_CONDITION_VARIABLE_INIT, RTL_RUN_ONCE, RTL_SRWLOCK, RTL_SRWLOCK_INIT, VOID }; pub const SRWLOCK_INIT: SRWLOCK = RTL_SRWLOCK_INIT; pub type SRWLOCK = RTL_SRWLOCK; pub type PSRWLOCK = *mut RTL_SRWLOCK; extern "system" { pub fn InitializeSRWLock( SRWLock: PSRWLOCK, ); pub fn ReleaseSRWLockExclusive( SRWLock: PSRWLOCK, ); pub fn ReleaseSRWLockShared( SRWLock: PSRWLOCK, ); pub fn AcquireSRWLockExclusive( SRWLock: PSRWLOCK, ); pub fn AcquireSRWLockShared( SRWLock: PSRWLOCK, ); pub fn TryAcquireSRWLockExclusive( SRWLock: PSRWLOCK, ) -> BOOLEAN; pub fn TryAcquireSRWLockShared( SRWLock: PSRWLOCK, ) -> BOOLEAN; pub fn InitializeCriticalSection( lpCriticalSection: LPCRITICAL_SECTION, ); pub fn EnterCriticalSection( lpCriticalSection: LPCRITICAL_SECTION, ); pub fn LeaveCriticalSection( lpCriticalSection: LPCRITICAL_SECTION, ); pub fn InitializeCriticalSectionAndSpinCount( lpCriticalSection: LPCRITICAL_SECTION, dwSpinCount: DWORD, ) -> BOOL; pub fn InitializeCriticalSectionEx( lpCriticalSection: LPCRITICAL_SECTION, dwSpinCount: DWORD, Flags: DWORD, ) -> BOOL; pub fn SetCriticalSectionSpinCount( lpCriticalSection: LPCRITICAL_SECTION, dwSpinCount: DWORD, ) -> DWORD; pub fn TryEnterCriticalSection( lpCriticalSection: LPCRITICAL_SECTION, ) -> BOOL; pub fn DeleteCriticalSection( lpCriticalSection: LPCRITICAL_SECTION, ); } pub type INIT_ONCE = RTL_RUN_ONCE; pub type PINIT_ONCE = PRTL_RUN_ONCE; pub type LPINIT_ONCE = PRTL_RUN_ONCE; //pub const INIT_ONCE_STATIC_INIT: INIT_ONCE = RTL_RUN_ONCE_INIT; //pub const INIT_ONCE_CHECK_ONLY: ULONG = RTL_RUN_ONCE_CHECK_ONLY; //pub const INIT_ONCE_ASYNC: ULONG = RTL_RUN_ONCE_ASYNC; //pub const INIT_ONCE_INIT_FAILED: ULONG = RTL_RUN_ONCE_INIT_FAILED; //pub const INIT_ONCE_CTX_RESERVED_BITS: usize = RTL_RUN_ONCE_CTX_RESERVED_BITS; FN!{stdcall PINIT_ONCE_FN( InitOnce: PINIT_ONCE, Parameter: PVOID, Context: *mut PVOID, ) -> BOOL} extern "system" { pub fn InitOnceInitialize( InitOnce: PINIT_ONCE, ); pub fn InitOnceExecuteOnce( InitOnce: PINIT_ONCE, InitFn: PINIT_ONCE_FN, Parameter: PVOID, Context: *mut LPVOID, ) -> BOOL; pub fn InitOnceBeginInitialize( lpInitOnce: LPINIT_ONCE, dwFlags: DWORD, fPending: PBOOL, lpContext: *mut LPVOID, ) -> BOOL; pub fn InitOnceComplete( lpInitOnce: LPINIT_ONCE, dwFlags: DWORD, lpContext: LPVOID, ) -> BOOL; } pub type CONDITION_VARIABLE = RTL_CONDITION_VARIABLE; pub type PCONDITION_VARIABLE = *mut CONDITION_VARIABLE; pub const CONDITION_VARIABLE_INIT: CONDITION_VARIABLE = RTL_CONDITION_VARIABLE_INIT; //pub const CONDITION_VARIABLE_LOCKMODE_SHARED: ULONG = RTL_CONDITION_VARIABLE_LOCKMODE_SHARED; extern "system" { pub fn InitializeConditionVariable( ConditionVariable: PCONDITION_VARIABLE, ); pub fn WakeConditionVariable( ConditionVariable: PCONDITION_VARIABLE, ); pub fn WakeAllConditionVariable( ConditionVariable: PCONDITION_VARIABLE, ); pub fn SleepConditionVariableCS( ConditionVariable: PCONDITION_VARIABLE, CriticalSection: PCRITICAL_SECTION, dwMilliseconds: DWORD, ) -> BOOL; pub fn SleepConditionVariableSRW( ConditionVariable: PCONDITION_VARIABLE, SRWLock: PSRWLOCK, dwMilliseconds: DWORD, Flags: ULONG, ) -> BOOL; pub fn SetEvent( hEvent: HANDLE, ) -> BOOL; pub fn ResetEvent( hEvent: HANDLE, ) -> BOOL; pub fn ReleaseSemaphore( hSemaphore: HANDLE, lReleaseCount: LONG, lpPreviousCount: LPLONG, ) -> BOOL; pub fn ReleaseMutex( hMutex: HANDLE, ) -> BOOL; pub fn WaitForSingleObject( hHandle: HANDLE, dwMilliseconds: DWORD, ) -> DWORD; pub fn SleepEx( dwMilliseconds: DWORD, bAlertable: BOOL, ) -> DWORD; pub fn WaitForSingleObjectEx( hHandle: HANDLE, dwMilliseconds: DWORD, bAlertable: BOOL, ) -> DWORD; pub fn WaitForMultipleObjectsEx( nCount: DWORD, lpHandles: *const HANDLE, bWaitAll: BOOL, dwMilliseconds: DWORD, bAlertable: BOOL, ) -> DWORD; } //pub const MUTEX_MODIFY_STATE: DWORD = MUTANT_QUERY_STATE; //pub const MUTEX_ALL_ACCESS: DWORD = MUTANT_ALL_ACCESS; extern "system" { pub fn CreateMutexA( lpMutexAttributes: LPSECURITY_ATTRIBUTES, bInitialOwner: BOOL, lpName: LPCSTR, ) -> HANDLE; pub fn CreateMutexW( lpMutexAttributes: LPSECURITY_ATTRIBUTES, bInitialOwner: BOOL, lpName: LPCWSTR, ) -> HANDLE; pub fn OpenMutexW( dwDesiredAccess: DWORD, bInheritHandle: BOOL, lpName: LPCWSTR, ) -> HANDLE; pub fn CreateEventA( lpEventAttributes: LPSECURITY_ATTRIBUTES, bManualReset: BOOL, bInitialState: BOOL, lpName: LPCSTR, ) -> HANDLE; pub fn CreateEventW( lpEventAttributes: LPSECURITY_ATTRIBUTES, bManualReset: BOOL, bInitialState: BOOL, lpName: LPCWSTR, ) -> HANDLE; pub fn OpenEventA( dwDesiredAccess: DWORD, bInheritHandle: BOOL, lpName: LPCSTR, ) -> HANDLE; pub fn OpenEventW( dwDesiredAccess: DWORD, bInheritHandle: BOOL, lpName: LPCWSTR, ) -> HANDLE; pub fn OpenSemaphoreW( dwDesiredAccess: DWORD, bInheritHandle: BOOL, lpName: LPCWSTR, ) -> HANDLE; } FN!{stdcall PTIMERAPCROUTINE( lpArgToCompletionRoutine: LPVOID, dwTimerLowValue: DWORD, dwTimerHighValue: DWORD, ) -> ()} extern "system" { pub fn OpenWaitableTimerW( dwDesiredAccess: DWORD, bInheritHandle: BOOL, lpTimerName: LPCWSTR, ) -> HANDLE; pub fn SetWaitableTimerEx( hTimer: HANDLE, lpDueTime: *const LARGE_INTEGER, lPeriod: LONG, pfnCompletionRoutine: PTIMERAPCROUTINE, lpArgToCompletionRoutine: LPVOID, WakeContext: PREASON_CONTEXT, TolerableDelay: ULONG, ) -> BOOL; pub fn SetWaitableTimer( hTimer: HANDLE, lpDueTime: *const LARGE_INTEGER, lPeriod: LONG, pfnCompletionRoutine: PTIMERAPCROUTINE, lpArgToCompletionRoutine: LPVOID, fResume: BOOL, ) -> BOOL; pub fn CancelWaitableTimer( hTimer: HANDLE, ) -> BOOL; } pub const CREATE_MUTEX_INITIAL_OWNER: DWORD = 0x00000001; extern "system" { pub fn CreateMutexExA( lpMutexAttributes: LPSECURITY_ATTRIBUTES, lpName: LPCSTR, dwFlags: DWORD, dwDesiredAccess: DWORD, ) -> HANDLE; pub fn CreateMutexExW( lpMutexAttributes: LPSECURITY_ATTRIBUTES, lpName: LPCWSTR, dwFlags: DWORD, dwDesiredAccess: DWORD, ) -> HANDLE; } pub const CREATE_EVENT_MANUAL_RESET: DWORD = 0x00000001; pub const CREATE_EVENT_INITIAL_SET: DWORD = 0x00000002; extern "system" { pub fn CreateEventExA( lpEventAttributes: LPSECURITY_ATTRIBUTES, lpName: LPCSTR, dwFlags: DWORD, dwDesiredAccess: DWORD, ) -> HANDLE; pub fn CreateEventExW( lpEventAttributes: LPSECURITY_ATTRIBUTES, lpName: LPCWSTR, dwFlags: DWORD, dwDesiredAccess: DWORD, ) -> HANDLE; pub fn CreateSemaphoreExW( lpSemaphoreAttributes: LPSECURITY_ATTRIBUTES, lInitialCount: LONG, lMaximumCount: LONG, lpName: LPCWSTR, dwFlags: DWORD, dwDesiredAccess: DWORD, ) -> HANDLE; } pub const CREATE_WAITABLE_TIMER_MANUAL_RESET: DWORD = 0x00000001; extern "system" { pub fn CreateWaitableTimerExW( lpTimerAttributes: LPSECURITY_ATTRIBUTES, lpTimerName: LPCWSTR, dwFlags: DWORD, dwDesiredAccess: DWORD, ) -> HANDLE; } pub type SYNCHRONIZATION_BARRIER = RTL_BARRIER; pub type PSYNCHRONIZATION_BARRIER = PRTL_BARRIER; pub type LPSYNCHRONIZATION_BARRIER = PRTL_BARRIER; pub const SYNCHRONIZATION_BARRIER_FLAGS_SPIN_ONLY: DWORD = 0x01; pub const SYNCHRONIZATION_BARRIER_FLAGS_BLOCK_ONLY: DWORD = 0x02; pub const SYNCHRONIZATION_BARRIER_FLAGS_NO_DELETE: DWORD = 0x04; extern "system" { pub fn EnterSynchronizationBarrier( lpBarrier: LPSYNCHRONIZATION_BARRIER, dwFlags: DWORD, ) -> BOOL; pub fn InitializeSynchronizationBarrier( lpBarrier: LPSYNCHRONIZATION_BARRIER, lTotalThreads: LONG, lSpinCount: LONG, ) -> BOOL; pub fn DeleteSynchronizationBarrier( lpBarrier: LPSYNCHRONIZATION_BARRIER, ) -> BOOL; pub fn Sleep( dwMilliseconds: DWORD, ); pub fn WaitOnAddress( Address: *mut VOID, CompareAddress: PVOID, AddressSize: SIZE_T, dwMilliseconds: DWORD, ) -> BOOL; pub fn WakeByAddressSingle( Address: PVOID, ); pub fn WakeByAddressAll( Address: PVOID, ); pub fn SignalObjectAndWait( hObjectToSignal: HANDLE, hObjectToWaitOn: HANDLE, dwMilliseconds: DWORD, bAlertable: BOOL, ) -> DWORD; pub fn WaitForMultipleObjects( nCount: DWORD, lpHandles: *const HANDLE, bWaitAll: BOOL, dwMilliseconds: DWORD, ) -> DWORD; pub fn CreateSemaphoreW( lpSemaphoreAttributes: LPSECURITY_ATTRIBUTES, lInitialCount: LONG, lMaximumCount: LONG, lpName: LPCWSTR, ) -> HANDLE; pub fn CreateWaitableTimerW( lpTimerAttributes: LPSECURITY_ATTRIBUTES, bManualReset: BOOL, lpTimerName: LPCWSTR, ) -> HANDLE; }