Chris@16: // synchronizaion.hpp --------------------------------------------------------------// Chris@16: Chris@16: // Copyright 2010 Vicente J. Botet Escriba Chris@16: Chris@16: // Distributed under the Boost Software License, Version 1.0. Chris@16: // See http://www.boost.org/LICENSE_1_0.txt Chris@16: Chris@16: Chris@16: #ifndef BOOST_DETAIL_WINAPI_SYNCHRONIZATION_HPP Chris@16: #define BOOST_DETAIL_WINAPI_SYNCHRONIZATION_HPP Chris@16: Chris@16: #include Chris@16: Chris@16: #ifdef BOOST_HAS_PRAGMA_ONCE Chris@16: #pragma once Chris@16: #endif Chris@16: Chris@16: namespace boost Chris@16: { Chris@16: namespace detail Chris@16: { Chris@16: namespace winapi Chris@16: { Chris@16: #if defined( BOOST_USE_WINDOWS_H ) Chris@16: typedef ::CRITICAL_SECTION CRITICAL_SECTION_; Chris@16: typedef ::PAPCFUNC PAPCFUNC_; Chris@16: Chris@101: #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6 Chris@101: typedef ::INIT_ONCE INIT_ONCE_; Chris@101: typedef ::PINIT_ONCE PINIT_ONCE_; Chris@101: typedef ::LPINIT_ONCE LPINIT_ONCE_; Chris@101: #define BOOST_DETAIL_WINAPI_INIT_ONCE_STATIC_INIT INIT_ONCE_STATIC_INIT Chris@101: typedef ::PINIT_ONCE_FN PINIT_ONCE_FN_; Chris@101: Chris@101: typedef ::SRWLOCK SRWLOCK_; Chris@101: typedef ::PSRWLOCK PSRWLOCK_; Chris@101: #define BOOST_DETAIL_WINAPI_SRWLOCK_INIT SRWLOCK_INIT Chris@101: Chris@101: typedef ::CONDITION_VARIABLE CONDITION_VARIABLE_; Chris@101: typedef ::PCONDITION_VARIABLE PCONDITION_VARIABLE_; Chris@101: #define BOOST_DETAIL_WINAPI_CONDITION_VARIABLE_INIT CONDITION_VARIABLE_INIT Chris@101: #endif Chris@101: Chris@16: using ::InitializeCriticalSection; Chris@101: #if BOOST_USE_WINAPI_VERSION >= 0x0403 Chris@101: using ::InitializeCriticalSectionAndSpinCount; Chris@101: #endif Chris@16: using ::EnterCriticalSection; Chris@16: using ::TryEnterCriticalSection; Chris@16: using ::LeaveCriticalSection; Chris@16: using ::DeleteCriticalSection; Chris@16: Chris@16: # ifdef BOOST_NO_ANSI_APIS Chris@16: using ::CreateMutexW; Chris@101: using ::OpenMutexW; Chris@16: using ::CreateEventW; Chris@16: using ::OpenEventW; Chris@16: using ::CreateSemaphoreW; Chris@101: using ::OpenSemaphoreW; Chris@16: # else Chris@16: using ::CreateMutexA; Chris@101: using ::OpenMutexA; Chris@16: using ::CreateEventA; Chris@16: using ::OpenEventA; Chris@16: using ::CreateSemaphoreA; Chris@101: using ::OpenSemaphoreA; Chris@16: # endif Chris@16: using ::ReleaseMutex; Chris@16: using ::ReleaseSemaphore; Chris@16: using ::SetEvent; Chris@16: using ::ResetEvent; Chris@16: using ::WaitForMultipleObjects; Chris@16: using ::WaitForSingleObject; Chris@16: using ::QueueUserAPC; Chris@16: Chris@101: #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6 Chris@101: using ::InitOnceInitialize; Chris@101: using ::InitOnceExecuteOnce; Chris@101: using ::InitOnceBeginInitialize; Chris@101: using ::InitOnceComplete; Chris@101: Chris@101: using ::InitializeSRWLock; Chris@101: using ::AcquireSRWLockExclusive; Chris@101: using ::TryAcquireSRWLockExclusive; Chris@101: using ::ReleaseSRWLockExclusive; Chris@101: using ::AcquireSRWLockShared; Chris@101: using ::TryAcquireSRWLockShared; Chris@101: using ::ReleaseSRWLockShared; Chris@101: Chris@101: using ::InitializeConditionVariable; Chris@101: using ::WakeConditionVariable; Chris@101: using ::WakeAllConditionVariable; Chris@101: using ::SleepConditionVariableCS; Chris@101: using ::SleepConditionVariableSRW; Chris@101: #endif Chris@101: Chris@16: const DWORD_ infinite = INFINITE; Chris@16: const DWORD_ wait_abandoned = WAIT_ABANDONED; Chris@16: const DWORD_ wait_object_0 = WAIT_OBJECT_0; Chris@16: const DWORD_ wait_timeout = WAIT_TIMEOUT; Chris@16: const DWORD_ wait_failed = WAIT_FAILED; Chris@16: Chris@101: #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6 Chris@101: const DWORD_ init_once_async = INIT_ONCE_ASYNC; Chris@101: const DWORD_ init_once_check_only = INIT_ONCE_CHECK_ONLY; Chris@101: const DWORD_ init_once_init_failed = INIT_ONCE_INIT_FAILED; Chris@101: const DWORD_ init_once_ctx_reserved_bits = INIT_ONCE_CTX_RESERVED_BITS; Chris@101: Chris@101: const ULONG_ condition_variable_lockmode_shared = CONDITION_VARIABLE_LOCKMODE_SHARED; Chris@101: #endif Chris@101: Chris@16: #else // defined( BOOST_USE_WINDOWS_H ) Chris@16: Chris@16: extern "C" { Chris@16: Chris@101: typedef struct CRITICAL_SECTION_ Chris@16: { Chris@16: struct critical_section_debug * DebugInfo; Chris@16: long LockCount; Chris@16: long RecursionCount; Chris@16: void * OwningThread; Chris@16: void * LockSemaphore; Chris@16: #if defined(_WIN64) Chris@16: unsigned __int64 SpinCount; Chris@16: #else Chris@16: unsigned long SpinCount; Chris@16: #endif Chris@101: } Chris@101: *PCRITICAL_SECTION_; Chris@16: Chris@101: #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6 Chris@101: typedef union INIT_ONCE_ Chris@101: { Chris@101: PVOID_ Ptr; Chris@101: } Chris@101: *PINIT_ONCE_, *LPINIT_ONCE_; Chris@101: #define BOOST_DETAIL_WINAPI_INIT_ONCE_STATIC_INIT {0} Chris@101: typedef BOOL_ (WINAPI *PINIT_ONCE_FN_)(PINIT_ONCE_ InitOnce, PVOID_ Parameter, PVOID_ *Context); Chris@16: Chris@101: typedef struct SRWLOCK_ Chris@101: { Chris@101: PVOID_ Ptr; Chris@101: } Chris@101: * PSRWLOCK_; Chris@101: #define BOOST_DETAIL_WINAPI_SRWLOCK_INIT {0} Chris@101: Chris@101: typedef struct CONDITION_VARIABLE_ Chris@101: { Chris@101: PVOID_ Ptr; Chris@101: } Chris@101: * PCONDITION_VARIABLE_; Chris@101: #define BOOST_DETAIL_WINAPI_CONDITION_VARIABLE_INIT {0} Chris@101: Chris@101: #endif Chris@101: Chris@101: __declspec(dllimport) void WINAPI Chris@101: InitializeCriticalSection(PCRITICAL_SECTION_); Chris@101: #if BOOST_USE_WINAPI_VERSION >= 0x0403 Chris@101: __declspec(dllimport) BOOL_ WINAPI Chris@101: InitializeCriticalSectionAndSpinCount(CRITICAL_SECTION_* lpCS, DWORD_ dwSpinCount); Chris@101: #endif Chris@101: __declspec(dllimport) void WINAPI Chris@101: EnterCriticalSection(PCRITICAL_SECTION_); Chris@101: __declspec(dllimport) BOOL_ WINAPI Chris@101: TryEnterCriticalSection(PCRITICAL_SECTION_); Chris@101: __declspec(dllimport) void WINAPI Chris@101: LeaveCriticalSection(PCRITICAL_SECTION_); Chris@101: __declspec(dllimport) void WINAPI Chris@101: DeleteCriticalSection(PCRITICAL_SECTION_); Chris@101: Chris@101: struct _SECURITY_ATTRIBUTES; Chris@16: # ifdef BOOST_NO_ANSI_APIS Chris@101: __declspec(dllimport) HANDLE_ WINAPI Chris@101: CreateMutexW(_SECURITY_ATTRIBUTES*, BOOL_, LPCWSTR_); Chris@101: __declspec(dllimport) HANDLE_ WINAPI Chris@101: OpenMutexW(DWORD_ dwDesiredAccess, BOOL_ bInheritHandle, LPCWSTR_ lpName); Chris@101: __declspec(dllimport) HANDLE_ WINAPI Chris@101: CreateSemaphoreW(_SECURITY_ATTRIBUTES*, LONG_, LONG_, LPCWSTR_); Chris@101: __declspec(dllimport) HANDLE_ WINAPI Chris@101: OpenSemaphoreW(DWORD_ dwDesiredAccess, BOOL_ bInheritHandle, LPCWSTR_ lpName); Chris@101: __declspec(dllimport) HANDLE_ WINAPI Chris@101: CreateEventW(_SECURITY_ATTRIBUTES*, BOOL_, BOOL_, LPCWSTR_); Chris@101: __declspec(dllimport) HANDLE_ WINAPI Chris@101: OpenEventW(DWORD_, BOOL_, LPCWSTR_); Chris@16: # else Chris@101: __declspec(dllimport) HANDLE_ WINAPI Chris@101: CreateMutexA(_SECURITY_ATTRIBUTES*, BOOL_, LPCSTR_); Chris@101: __declspec(dllimport) HANDLE_ WINAPI Chris@101: OpenMutexA(DWORD_ dwDesiredAccess, BOOL_ bInheritHandle, LPCSTR_ lpName); Chris@101: __declspec(dllimport) HANDLE_ WINAPI Chris@101: CreateSemaphoreA(_SECURITY_ATTRIBUTES*, LONG_, LONG_, LPCSTR_); Chris@101: __declspec(dllimport) HANDLE_ WINAPI Chris@101: OpenSemaphoreA(DWORD_ dwDesiredAccess, BOOL_ bInheritHandle, LPCSTR_ lpName); Chris@101: __declspec(dllimport) HANDLE_ WINAPI Chris@101: CreateEventA(_SECURITY_ATTRIBUTES*, BOOL_, BOOL_, LPCSTR_); Chris@101: __declspec(dllimport) HANDLE_ WINAPI Chris@101: OpenEventA(DWORD_, BOOL_, LPCSTR_); Chris@16: # endif Chris@101: __declspec(dllimport) BOOL_ WINAPI Chris@101: ReleaseMutex(HANDLE_); Chris@101: __declspec(dllimport) DWORD_ WINAPI Chris@101: WaitForSingleObject(HANDLE_, DWORD_); Chris@101: __declspec(dllimport) DWORD_ WINAPI Chris@101: WaitForMultipleObjects(DWORD_ nCount, Chris@101: HANDLE_ const * lpHandles, Chris@101: BOOL_ bWaitAll, Chris@101: DWORD_ dwMilliseconds); Chris@101: __declspec(dllimport) BOOL_ WINAPI Chris@101: ReleaseSemaphore(HANDLE_, LONG_, LONG_*); Chris@101: __declspec(dllimport) BOOL_ WINAPI Chris@101: SetEvent(HANDLE_); Chris@101: __declspec(dllimport) BOOL_ WINAPI Chris@101: ResetEvent(HANDLE_); Chris@101: Chris@101: typedef void (__stdcall *PAPCFUNC_)(ULONG_PTR_); Chris@101: __declspec(dllimport) DWORD_ WINAPI Chris@101: QueueUserAPC(PAPCFUNC_, HANDLE_, ULONG_PTR_); Chris@101: Chris@101: #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6 Chris@101: __declspec(dllimport) void WINAPI InitOnceInitialize(PINIT_ONCE_); Chris@101: __declspec(dllimport) BOOL_ WINAPI InitOnceExecuteOnce(PINIT_ONCE_ InitOnce, PINIT_ONCE_FN_ InitFn, PVOID_ Parameter, LPVOID_* Context); Chris@101: __declspec(dllimport) BOOL_ WINAPI InitOnceBeginInitialize(LPINIT_ONCE_ lpInitOnce, DWORD_ dwFlags, BOOL_* fPending, LPVOID_* lpContext); Chris@101: __declspec(dllimport) BOOL_ WINAPI InitOnceComplete(LPINIT_ONCE_ lpInitOnce, DWORD_ dwFlags, LPVOID_* lpContext); Chris@101: Chris@101: Chris@101: __declspec(dllimport) void WINAPI InitializeSRWLock(PSRWLOCK_ SRWLock); Chris@101: __declspec(dllimport) void WINAPI AcquireSRWLockExclusive(PSRWLOCK_ SRWLock); Chris@101: __declspec(dllimport) BOOLEAN_ WINAPI TryAcquireSRWLockExclusive(PSRWLOCK_ SRWLock); Chris@101: __declspec(dllimport) void WINAPI ReleaseSRWLockExclusive(PSRWLOCK_ SRWLock); Chris@101: __declspec(dllimport) void WINAPI AcquireSRWLockShared(PSRWLOCK_ SRWLock); Chris@101: __declspec(dllimport) BOOLEAN_ WINAPI TryAcquireSRWLockShared(PSRWLOCK_ SRWLock); Chris@101: __declspec(dllimport) void WINAPI ReleaseSRWLockShared(PSRWLOCK_ SRWLock); Chris@101: Chris@101: __declspec(dllimport) void WINAPI InitializeConditionVariable(PCONDITION_VARIABLE_ ConditionVariable); Chris@101: __declspec(dllimport) void WINAPI WakeConditionVariable(PCONDITION_VARIABLE_ ConditionVariable); Chris@101: __declspec(dllimport) void WINAPI WakeAllConditionVariable(PCONDITION_VARIABLE_ ConditionVariable); Chris@101: __declspec(dllimport) BOOL_ WINAPI SleepConditionVariableCS(PCONDITION_VARIABLE_ ConditionVariable, PCRITICAL_SECTION_ CriticalSection, DWORD_ dwMilliseconds); Chris@101: __declspec(dllimport) BOOL_ WINAPI SleepConditionVariableSRW(PCONDITION_VARIABLE_ ConditionVariable, PSRWLOCK_ SRWLock, DWORD_ dwMilliseconds, ULONG_ Flags); Chris@101: #endif Chris@16: Chris@16: } // extern "C" Chris@16: Chris@101: const DWORD_ infinite = (DWORD_)0xFFFFFFFF; Chris@101: const DWORD_ wait_abandoned = 0x00000080L; Chris@101: const DWORD_ wait_object_0 = 0x00000000L; Chris@101: const DWORD_ wait_timeout = 0x00000102L; Chris@101: const DWORD_ wait_failed = (DWORD_)0xFFFFFFFF; Chris@101: Chris@101: #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6 Chris@101: const DWORD_ init_once_async = 0x00000002UL; Chris@101: const DWORD_ init_once_check_only = 0x00000001UL; Chris@101: const DWORD_ init_once_init_failed = 0x00000004UL; Chris@101: const DWORD_ init_once_ctx_reserved_bits = 2; Chris@101: Chris@101: const ULONG_ condition_variable_lockmode_shared = 0x00000001; Chris@101: #endif Chris@16: Chris@16: #endif // defined( BOOST_USE_WINDOWS_H ) Chris@16: Chris@101: const DWORD_ max_non_infinite_wait = (DWORD_)0xFFFFFFFE; Chris@101: Chris@101: BOOST_FORCEINLINE HANDLE_ create_anonymous_mutex(_SECURITY_ATTRIBUTES* lpAttributes, BOOL_ bInitialOwner) Chris@101: { Chris@101: #ifdef BOOST_NO_ANSI_APIS Chris@101: return CreateMutexW(lpAttributes, bInitialOwner, 0); Chris@101: #else Chris@101: return CreateMutexA(lpAttributes, bInitialOwner, 0); Chris@101: #endif Chris@101: } Chris@101: Chris@101: BOOST_FORCEINLINE HANDLE_ create_anonymous_semaphore(_SECURITY_ATTRIBUTES* lpAttributes, LONG_ lInitialCount, LONG_ lMaximumCount) Chris@101: { Chris@101: #ifdef BOOST_NO_ANSI_APIS Chris@101: return CreateSemaphoreW(lpAttributes, lInitialCount, lMaximumCount, 0); Chris@101: #else Chris@101: return CreateSemaphoreA(lpAttributes, lInitialCount, lMaximumCount, 0); Chris@101: #endif Chris@101: } Chris@101: Chris@101: BOOST_FORCEINLINE HANDLE_ create_anonymous_event(_SECURITY_ATTRIBUTES* lpAttributes, BOOL_ bManualReset, BOOL_ bInitialState) Chris@101: { Chris@101: #ifdef BOOST_NO_ANSI_APIS Chris@101: return CreateEventW(lpAttributes, bManualReset, bInitialState, 0); Chris@101: #else Chris@101: return CreateEventA(lpAttributes, bManualReset, bInitialState, 0); Chris@101: #endif Chris@101: } Chris@101: Chris@16: } Chris@16: } Chris@16: } Chris@16: Chris@16: #endif // BOOST_DETAIL_WINAPI_SYNCHRONIZATION_HPP