Blame winpr/include/winpr/synch.h

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