|
Packit |
1fb8d4 |
/**
|
|
Packit |
1fb8d4 |
* WinPR: Windows Portable Runtime
|
|
Packit |
1fb8d4 |
* Synchronization Functions
|
|
Packit |
1fb8d4 |
*
|
|
Packit |
1fb8d4 |
* Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com>
|
|
Packit |
1fb8d4 |
* Copyright 2014 Thincast Technologies GmbH
|
|
Packit |
1fb8d4 |
* Copyright 2014 Norbert Federa <norbert.federa@thincast.com>
|
|
Packit |
1fb8d4 |
*
|
|
Packit |
1fb8d4 |
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
Packit |
1fb8d4 |
* you may not use this file except in compliance with the License.
|
|
Packit |
1fb8d4 |
* You may obtain a copy of the License at
|
|
Packit |
1fb8d4 |
*
|
|
Packit |
1fb8d4 |
* http://www.apache.org/licenses/LICENSE-2.0
|
|
Packit |
1fb8d4 |
*
|
|
Packit |
1fb8d4 |
* Unless required by applicable law or agreed to in writing, software
|
|
Packit |
1fb8d4 |
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
Packit |
1fb8d4 |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
Packit |
1fb8d4 |
* See the License for the specific language governing permissions and
|
|
Packit |
1fb8d4 |
* limitations under the License.
|
|
Packit |
1fb8d4 |
*/
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#ifndef WINPR_SYNCH_H
|
|
Packit |
1fb8d4 |
#define WINPR_SYNCH_H
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#include <stdio.h>
|
|
Packit |
1fb8d4 |
#include <stdlib.h>
|
|
Packit |
1fb8d4 |
#include <string.h>
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#include <winpr/winpr.h>
|
|
Packit |
1fb8d4 |
#include <winpr/wtypes.h>
|
|
Packit |
1fb8d4 |
#include <winpr/error.h>
|
|
Packit |
1fb8d4 |
#include <winpr/handle.h>
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#include <winpr/nt.h>
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#ifdef __cplusplus
|
|
Packit |
1fb8d4 |
extern "C" {
|
|
Packit |
1fb8d4 |
#endif
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#ifndef _WIN32
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
/* Mutex */
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
WINPR_API HANDLE CreateMutexA(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCSTR lpName);
|
|
Packit |
1fb8d4 |
WINPR_API HANDLE CreateMutexW(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCWSTR lpName);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
WINPR_API HANDLE CreateMutexExA(LPSECURITY_ATTRIBUTES lpMutexAttributes, LPCTSTR lpName, DWORD dwFlags, DWORD dwDesiredAccess);
|
|
Packit |
1fb8d4 |
WINPR_API HANDLE CreateMutexExW(LPSECURITY_ATTRIBUTES lpMutexAttributes, LPCWSTR lpName, DWORD dwFlags, DWORD dwDesiredAccess);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
WINPR_API HANDLE OpenMutexA(DWORD dwDesiredAccess, BOOL bInheritHandle,LPCSTR lpName);
|
|
Packit |
1fb8d4 |
WINPR_API HANDLE OpenMutexW(DWORD dwDesiredAccess, BOOL bInheritHandle,LPCWSTR lpName);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
WINPR_API BOOL ReleaseMutex(HANDLE hMutex);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#ifdef UNICODE
|
|
Packit |
1fb8d4 |
#define CreateMutex CreateMutexW
|
|
Packit |
1fb8d4 |
#define CreateMutexEx CreateMutexExW
|
|
Packit |
1fb8d4 |
#define OpenMutex OpenMutexW
|
|
Packit |
1fb8d4 |
#else
|
|
Packit |
1fb8d4 |
#define CreateMutex CreateMutexA
|
|
Packit |
1fb8d4 |
#define CreateMutexEx CreateMutexExA
|
|
Packit |
1fb8d4 |
#define OpenMutex OpenMutexA
|
|
Packit |
1fb8d4 |
#endif
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
/* Semaphore */
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
WINPR_API HANDLE CreateSemaphoreA(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialCount, LONG lMaximumCount, LPCSTR lpName);
|
|
Packit |
1fb8d4 |
WINPR_API HANDLE CreateSemaphoreW(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialCount, LONG lMaximumCount, LPCWSTR lpName);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
WINPR_API HANDLE OpenSemaphoreA(DWORD dwDesiredAccess, BOOL bInheritHandle, LPCSTR lpName);
|
|
Packit |
1fb8d4 |
WINPR_API HANDLE OpenSemaphoreW(DWORD dwDesiredAccess, BOOL bInheritHandle, LPCWSTR lpName);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#ifdef UNICODE
|
|
Packit |
1fb8d4 |
#define CreateSemaphore CreateSemaphoreW
|
|
Packit |
1fb8d4 |
#define OpenSemaphore OpenSemaphoreW
|
|
Packit |
1fb8d4 |
#else
|
|
Packit |
1fb8d4 |
#define CreateSemaphore CreateSemaphoreA
|
|
Packit |
1fb8d4 |
#define OpenSemaphore OpenSemaphoreA
|
|
Packit |
1fb8d4 |
#endif
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
WINPR_API BOOL ReleaseSemaphore(HANDLE hSemaphore, LONG lReleaseCount, LPLONG lpPreviousCount);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
/* Event */
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
WINPR_API HANDLE CreateEventA(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL bInitialState, LPCSTR lpName);
|
|
Packit |
1fb8d4 |
WINPR_API HANDLE CreateEventW(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL bInitialState, LPCWSTR lpName);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
WINPR_API HANDLE CreateEventExA(LPSECURITY_ATTRIBUTES lpEventAttributes, LPCSTR lpName, DWORD dwFlags, DWORD dwDesiredAccess);
|
|
Packit |
1fb8d4 |
WINPR_API HANDLE CreateEventExW(LPSECURITY_ATTRIBUTES lpEventAttributes, LPCWSTR lpName, DWORD dwFlags, DWORD dwDesiredAccess);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
WINPR_API HANDLE OpenEventA(DWORD dwDesiredAccess, BOOL bInheritHandle, LPCSTR lpName);
|
|
Packit |
1fb8d4 |
WINPR_API HANDLE OpenEventW(DWORD dwDesiredAccess, BOOL bInheritHandle, LPCWSTR lpName);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
WINPR_API BOOL SetEvent(HANDLE hEvent);
|
|
Packit |
1fb8d4 |
WINPR_API BOOL ResetEvent(HANDLE hEvent);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#ifdef UNICODE
|
|
Packit |
1fb8d4 |
#define CreateEvent CreateEventW
|
|
Packit |
1fb8d4 |
#define CreateEventEx CreateEventExW
|
|
Packit |
1fb8d4 |
#define OpenEvent OpenEventW
|
|
Packit |
1fb8d4 |
#else
|
|
Packit |
1fb8d4 |
#define CreateEvent CreateEventA
|
|
Packit |
1fb8d4 |
#define CreateEventEx CreateEventExA
|
|
Packit |
1fb8d4 |
#define OpenEvent OpenEventA
|
|
Packit |
1fb8d4 |
#endif
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
/* Slim Reader/Writer (SRW) Lock */
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
typedef PVOID RTL_SRWLOCK;
|
|
Packit |
1fb8d4 |
typedef RTL_SRWLOCK SRWLOCK, *PSRWLOCK;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
WINPR_API VOID InitializeSRWLock(PSRWLOCK SRWLock);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
WINPR_API VOID AcquireSRWLockExclusive(PSRWLOCK SRWLock);
|
|
Packit |
1fb8d4 |
WINPR_API VOID AcquireSRWLockShared(PSRWLOCK SRWLock);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
WINPR_API BOOL TryAcquireSRWLockExclusive(PSRWLOCK SRWLock);
|
|
Packit |
1fb8d4 |
WINPR_API BOOL TryAcquireSRWLockShared(PSRWLOCK SRWLock);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
WINPR_API VOID ReleaseSRWLockExclusive(PSRWLOCK SRWLock);
|
|
Packit |
1fb8d4 |
WINPR_API VOID ReleaseSRWLockShared(PSRWLOCK SRWLock);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
/* Condition Variable */
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
typedef PVOID RTL_CONDITION_VARIABLE;
|
|
Packit |
1fb8d4 |
typedef RTL_CONDITION_VARIABLE CONDITION_VARIABLE, *PCONDITION_VARIABLE;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
/* Critical Section */
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#if defined(__linux__)
|
|
Packit |
1fb8d4 |
/**
|
|
Packit |
1fb8d4 |
* Linux NPTL thread synchronization primitives are implemented using
|
|
Packit |
1fb8d4 |
* the futex system calls ... we can't beat futex with a spin loop.
|
|
Packit |
1fb8d4 |
*/
|
|
Packit |
1fb8d4 |
#define WINPR_CRITICAL_SECTION_DISABLE_SPINCOUNT
|
|
Packit |
1fb8d4 |
#endif
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
typedef struct _RTL_CRITICAL_SECTION
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
PVOID DebugInfo;
|
|
Packit |
1fb8d4 |
LONG LockCount;
|
|
Packit |
1fb8d4 |
LONG RecursionCount;
|
|
Packit |
1fb8d4 |
HANDLE OwningThread;
|
|
Packit |
1fb8d4 |
HANDLE LockSemaphore;
|
|
Packit |
1fb8d4 |
ULONG_PTR SpinCount;
|
|
Packit |
1fb8d4 |
} RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
typedef RTL_CRITICAL_SECTION CRITICAL_SECTION;
|
|
Packit |
1fb8d4 |
typedef PRTL_CRITICAL_SECTION PCRITICAL_SECTION;
|
|
Packit |
1fb8d4 |
typedef PRTL_CRITICAL_SECTION LPCRITICAL_SECTION;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
WINPR_API VOID InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
|
|
Packit |
1fb8d4 |
WINPR_API BOOL InitializeCriticalSectionEx(LPCRITICAL_SECTION lpCriticalSection, DWORD dwSpinCount, DWORD Flags);
|
|
Packit |
1fb8d4 |
WINPR_API BOOL InitializeCriticalSectionAndSpinCount(LPCRITICAL_SECTION lpCriticalSection, DWORD dwSpinCount);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
WINPR_API DWORD SetCriticalSectionSpinCount(LPCRITICAL_SECTION lpCriticalSection, DWORD dwSpinCount);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
WINPR_API VOID EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
|
|
Packit |
1fb8d4 |
WINPR_API BOOL TryEnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
WINPR_API VOID LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
WINPR_API VOID DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
/* Sleep */
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
WINPR_API VOID Sleep(DWORD dwMilliseconds);
|
|
Packit |
1fb8d4 |
WINPR_API DWORD SleepEx(DWORD dwMilliseconds, BOOL bAlertable);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
/* Address */
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
WINPR_API VOID WakeByAddressAll(PVOID Address);
|
|
Packit |
1fb8d4 |
WINPR_API VOID WakeByAddressSingle(PVOID Address);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
WINPR_API BOOL WaitOnAddress(VOID volatile *Address, PVOID CompareAddress, SIZE_T AddressSize, DWORD dwMilliseconds);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
/* Wait */
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#define INFINITE 0xFFFFFFFF
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#define WAIT_OBJECT_0 0x00000000L
|
|
Packit |
1fb8d4 |
#define WAIT_ABANDONED 0x00000080L
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#ifndef WAIT_TIMEOUT
|
|
Packit |
1fb8d4 |
#define WAIT_TIMEOUT 0x00000102L
|
|
Packit |
1fb8d4 |
#endif
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#define WAIT_FAILED ((DWORD) 0xFFFFFFFF)
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#define MAXIMUM_WAIT_OBJECTS 64
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
WINPR_API DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds);
|
|
Packit |
1fb8d4 |
WINPR_API DWORD WaitForSingleObjectEx(HANDLE hHandle, DWORD dwMilliseconds, BOOL bAlertable);
|
|
Packit |
1fb8d4 |
WINPR_API DWORD WaitForMultipleObjects(DWORD nCount, const HANDLE* lpHandles, BOOL bWaitAll, DWORD dwMilliseconds);
|
|
Packit |
1fb8d4 |
WINPR_API DWORD WaitForMultipleObjectsEx(DWORD nCount, const HANDLE* lpHandles, BOOL bWaitAll, DWORD dwMilliseconds, BOOL bAlertable);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
WINPR_API DWORD SignalObjectAndWait(HANDLE hObjectToSignal, HANDLE hObjectToWaitOn, DWORD dwMilliseconds, BOOL bAlertable);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
/* Waitable Timer */
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#define CREATE_WAITABLE_TIMER_MANUAL_RESET 0x00000001
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
typedef struct _REASON_CONTEXT
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
ULONG Version;
|
|
Packit |
1fb8d4 |
DWORD Flags;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
union
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
struct
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
HMODULE LocalizedReasonModule;
|
|
Packit |
1fb8d4 |
ULONG LocalizedReasonId;
|
|
Packit |
1fb8d4 |
ULONG ReasonStringCount;
|
|
Packit |
1fb8d4 |
LPWSTR* ReasonStrings;
|
|
Packit |
1fb8d4 |
} Detailed;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
LPWSTR SimpleReasonString;
|
|
Packit |
1fb8d4 |
} Reason;
|
|
Packit |
1fb8d4 |
} REASON_CONTEXT, *PREASON_CONTEXT;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
typedef VOID (*PTIMERAPCROUTINE)(LPVOID lpArgToCompletionRoutine, DWORD dwTimerLowValue, DWORD dwTimerHighValue);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
WINPR_API HANDLE CreateWaitableTimerA(LPSECURITY_ATTRIBUTES lpTimerAttributes, BOOL bManualReset, LPCSTR lpTimerName);
|
|
Packit |
1fb8d4 |
WINPR_API HANDLE CreateWaitableTimerW(LPSECURITY_ATTRIBUTES lpTimerAttributes, BOOL bManualReset, LPCWSTR lpTimerName);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
WINPR_API HANDLE CreateWaitableTimerExA(LPSECURITY_ATTRIBUTES lpTimerAttributes, LPCSTR lpTimerName, DWORD dwFlags, DWORD dwDesiredAccess);
|
|
Packit |
1fb8d4 |
WINPR_API HANDLE CreateWaitableTimerExW(LPSECURITY_ATTRIBUTES lpTimerAttributes, LPCWSTR lpTimerName, DWORD dwFlags, DWORD dwDesiredAccess);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
WINPR_API BOOL SetWaitableTimer(HANDLE hTimer, const LARGE_INTEGER* lpDueTime, LONG lPeriod,
|
|
Packit |
1fb8d4 |
PTIMERAPCROUTINE pfnCompletionRoutine, LPVOID lpArgToCompletionRoutine, BOOL fResume);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
WINPR_API BOOL SetWaitableTimerEx(HANDLE hTimer, const LARGE_INTEGER* lpDueTime, LONG lPeriod,
|
|
Packit |
1fb8d4 |
PTIMERAPCROUTINE pfnCompletionRoutine, LPVOID lpArgToCompletionRoutine, PREASON_CONTEXT WakeContext, ULONG TolerableDelay);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
WINPR_API HANDLE OpenWaitableTimerA(DWORD dwDesiredAccess, BOOL bInheritHandle, LPCSTR lpTimerName);
|
|
Packit |
1fb8d4 |
WINPR_API HANDLE OpenWaitableTimerW(DWORD dwDesiredAccess, BOOL bInheritHandle, LPCWSTR lpTimerName);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
WINPR_API BOOL CancelWaitableTimer(HANDLE hTimer);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#ifdef UNICODE
|
|
Packit |
1fb8d4 |
#define CreateWaitableTimer CreateWaitableTimerW
|
|
Packit |
1fb8d4 |
#define CreateWaitableTimerEx CreateWaitableTimerExW
|
|
Packit |
1fb8d4 |
#define OpenWaitableTimer OpenWaitableTimerW
|
|
Packit |
1fb8d4 |
#else
|
|
Packit |
1fb8d4 |
#define CreateWaitableTimer CreateWaitableTimerA
|
|
Packit |
1fb8d4 |
#define CreateWaitableTimerEx CreateWaitableTimerExA
|
|
Packit |
1fb8d4 |
#define OpenWaitableTimer OpenWaitableTimerA
|
|
Packit |
1fb8d4 |
#endif
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
/**
|
|
Packit |
1fb8d4 |
* Timer-Queue Timer
|
|
Packit |
1fb8d4 |
*/
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#define WT_EXECUTEDEFAULT 0x00000000
|
|
Packit |
1fb8d4 |
#define WT_EXECUTEINIOTHREAD 0x00000001
|
|
Packit |
1fb8d4 |
#define WT_EXECUTEINUITHREAD 0x00000002
|
|
Packit |
1fb8d4 |
#define WT_EXECUTEINWAITTHREAD 0x00000004
|
|
Packit |
1fb8d4 |
#define WT_EXECUTEONLYONCE 0x00000008
|
|
Packit |
1fb8d4 |
#define WT_EXECUTELONGFUNCTION 0x00000010
|
|
Packit |
1fb8d4 |
#define WT_EXECUTEINTIMERTHREAD 0x00000020
|
|
Packit |
1fb8d4 |
#define WT_EXECUTEINPERSISTENTIOTHREAD 0x00000040
|
|
Packit |
1fb8d4 |
#define WT_EXECUTEINPERSISTENTTHREAD 0x00000080
|
|
Packit |
1fb8d4 |
#define WT_TRANSFER_IMPERSONATION 0x00000100
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
typedef VOID (*WAITORTIMERCALLBACK)(PVOID lpParameter, BOOLEAN TimerOrWaitFired);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
WINPR_API HANDLE CreateTimerQueue(void);
|
|
Packit |
1fb8d4 |
WINPR_API BOOL DeleteTimerQueue(HANDLE TimerQueue);
|
|
Packit |
1fb8d4 |
WINPR_API BOOL DeleteTimerQueueEx(HANDLE TimerQueue, HANDLE CompletionEvent);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
WINPR_API BOOL CreateTimerQueueTimer(PHANDLE phNewTimer, HANDLE TimerQueue,
|
|
Packit |
1fb8d4 |
WAITORTIMERCALLBACK Callback, PVOID Parameter, DWORD DueTime, DWORD Period, ULONG Flags);
|
|
Packit |
1fb8d4 |
WINPR_API BOOL ChangeTimerQueueTimer(HANDLE TimerQueue, HANDLE Timer, ULONG DueTime, ULONG Period);
|
|
Packit |
1fb8d4 |
WINPR_API BOOL DeleteTimerQueueTimer(HANDLE TimerQueue, HANDLE Timer, HANDLE CompletionEvent);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#endif
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#if (defined(_WIN32) && (_WIN32_WINNT < 0x0600))
|
|
Packit |
1fb8d4 |
#define InitializeCriticalSectionEx(lpCriticalSection, dwSpinCount, Flags) InitializeCriticalSectionAndSpinCount(lpCriticalSection, dwSpinCount)
|
|
Packit |
1fb8d4 |
#endif
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#ifndef _RTL_RUN_ONCE_DEF
|
|
Packit |
1fb8d4 |
#define _RTL_RUN_ONCE_DEF
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#define RTL_RUN_ONCE_INIT { 0 }
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#define RTL_RUN_ONCE_CHECK_ONLY 0x00000001
|
|
Packit |
1fb8d4 |
#define RTL_RUN_ONCE_ASYNC 0x00000002
|
|
Packit |
1fb8d4 |
#define RTL_RUN_ONCE_INIT_FAILED 0x00000004
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#define RTL_RUN_ONCE_CTX_RESERVED_BITS 2
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
typedef struct _RTL_RUN_ONCE
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
PVOID Ptr;
|
|
Packit |
1fb8d4 |
} RTL_RUN_ONCE, *PRTL_RUN_ONCE;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
typedef ULONG CALLBACK RTL_RUN_ONCE_INIT_FN (PRTL_RUN_ONCE RunOnce, PVOID Parameter, PVOID* Context);
|
|
Packit |
1fb8d4 |
typedef RTL_RUN_ONCE_INIT_FN *PRTL_RUN_ONCE_INIT_FN;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#endif
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#if (!defined(_WIN32)) || (defined(_WIN32) && (_WIN32_WINNT < 0x0600))
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
/* One-Time Initialization */
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#define INIT_ONCE_STATIC_INIT RTL_RUN_ONCE_INIT
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
typedef RTL_RUN_ONCE INIT_ONCE;
|
|
Packit |
1fb8d4 |
typedef PRTL_RUN_ONCE PINIT_ONCE;
|
|
Packit |
1fb8d4 |
typedef PRTL_RUN_ONCE LPINIT_ONCE;
|
|
Packit |
1fb8d4 |
typedef BOOL (CALLBACK * PINIT_ONCE_FN)(PINIT_ONCE InitOnce, PVOID Parameter, PVOID* Context);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
WINPR_API BOOL winpr_InitOnceBeginInitialize(LPINIT_ONCE lpInitOnce, DWORD dwFlags, PBOOL fPending, LPVOID* lpContext);
|
|
Packit |
1fb8d4 |
WINPR_API BOOL winpr_InitOnceComplete(LPINIT_ONCE lpInitOnce, DWORD dwFlags, LPVOID lpContext);
|
|
Packit |
1fb8d4 |
WINPR_API BOOL winpr_InitOnceExecuteOnce(PINIT_ONCE InitOnce, PINIT_ONCE_FN InitFn, PVOID Parameter, LPVOID* Context);
|
|
Packit |
1fb8d4 |
WINPR_API VOID winpr_InitOnceInitialize(PINIT_ONCE InitOnce);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#define InitOnceBeginInitialize winpr_InitOnceBeginInitialize
|
|
Packit |
1fb8d4 |
#define InitOnceComplete winpr_InitOnceComplete
|
|
Packit |
1fb8d4 |
#define InitOnceExecuteOnce winpr_InitOnceExecuteOnce
|
|
Packit |
1fb8d4 |
#define InitOnceInitialize winpr_InitOnceInitialize
|
|
Packit |
1fb8d4 |
#endif
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
/* Synchronization Barrier */
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#if (!defined(_WIN32)) || (defined(_WIN32) && (_WIN32_WINNT < 0x0602) && !defined(_SYNCHAPI_H_))
|
|
Packit |
1fb8d4 |
#define WINPR_SYNCHRONIZATION_BARRIER 1
|
|
Packit |
1fb8d4 |
#endif
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#ifdef WINPR_SYNCHRONIZATION_BARRIER
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
typedef struct _RTL_BARRIER
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
DWORD Reserved1;
|
|
Packit |
1fb8d4 |
DWORD Reserved2;
|
|
Packit |
1fb8d4 |
ULONG_PTR Reserved3[2];
|
|
Packit |
1fb8d4 |
DWORD Reserved4;
|
|
Packit |
1fb8d4 |
DWORD Reserved5;
|
|
Packit |
1fb8d4 |
} RTL_BARRIER, *PRTL_BARRIER;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
typedef RTL_BARRIER SYNCHRONIZATION_BARRIER;
|
|
Packit |
1fb8d4 |
typedef PRTL_BARRIER PSYNCHRONIZATION_BARRIER;
|
|
Packit |
1fb8d4 |
typedef PRTL_BARRIER LPSYNCHRONIZATION_BARRIER;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#define SYNCHRONIZATION_BARRIER_FLAGS_SPIN_ONLY 0x01
|
|
Packit |
1fb8d4 |
#define SYNCHRONIZATION_BARRIER_FLAGS_BLOCK_ONLY 0x02
|
|
Packit |
1fb8d4 |
#define SYNCHRONIZATION_BARRIER_FLAGS_NO_DELETE 0x04
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
WINPR_API BOOL WINAPI winpr_InitializeSynchronizationBarrier(LPSYNCHRONIZATION_BARRIER lpBarrier, LONG lTotalThreads, LONG lSpinCount);
|
|
Packit |
1fb8d4 |
WINPR_API BOOL WINAPI winpr_EnterSynchronizationBarrier(LPSYNCHRONIZATION_BARRIER lpBarrier, DWORD dwFlags);
|
|
Packit |
1fb8d4 |
WINPR_API BOOL WINAPI winpr_DeleteSynchronizationBarrier(LPSYNCHRONIZATION_BARRIER lpBarrier);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#define InitializeSynchronizationBarrier winpr_InitializeSynchronizationBarrier
|
|
Packit |
1fb8d4 |
#define EnterSynchronizationBarrier winpr_EnterSynchronizationBarrier
|
|
Packit |
1fb8d4 |
#define DeleteSynchronizationBarrier winpr_DeleteSynchronizationBarrier
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#endif
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
/* Extended API */
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
WINPR_API VOID USleep(DWORD dwMicroseconds);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
WINPR_API HANDLE CreateFileDescriptorEventW(LPSECURITY_ATTRIBUTES lpEventAttributes,
|
|
Packit |
1fb8d4 |
BOOL bManualReset, BOOL bInitialState, int FileDescriptor, ULONG mode);
|
|
Packit |
1fb8d4 |
WINPR_API HANDLE CreateFileDescriptorEventA(LPSECURITY_ATTRIBUTES lpEventAttributes,
|
|
Packit |
1fb8d4 |
BOOL bManualReset, BOOL bInitialState, int FileDescriptor, ULONG mode);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
WINPR_API HANDLE CreateWaitObjectEvent(LPSECURITY_ATTRIBUTES lpEventAttributes,
|
|
Packit |
1fb8d4 |
BOOL bManualReset, BOOL bInitialState, void* pObject);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#ifdef UNICODE
|
|
Packit |
1fb8d4 |
#define CreateFileDescriptorEvent CreateFileDescriptorEventW
|
|
Packit |
1fb8d4 |
#else
|
|
Packit |
1fb8d4 |
#define CreateFileDescriptorEvent CreateFileDescriptorEventA
|
|
Packit |
1fb8d4 |
#endif
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
WINPR_API int GetEventFileDescriptor(HANDLE hEvent);
|
|
Packit |
1fb8d4 |
WINPR_API int SetEventFileDescriptor(HANDLE hEvent, int FileDescriptor, ULONG mode);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
WINPR_API void* GetEventWaitObject(HANDLE hEvent);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#ifdef __cplusplus
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
#endif
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#endif /* WINPR_SYNCH_H */
|
|
Packit |
1fb8d4 |
|