// Windows/Synchronization.h | |
#ifndef __WINDOWS_SYNCHRONIZATION_H | |
#define __WINDOWS_SYNCHRONIZATION_H | |
#include "../../C/Threads.h" | |
#include "Defs.h" | |
#ifdef _WIN32 | |
#include "Handle.h" | |
#endif | |
namespace NWindows { | |
namespace NSynchronization { | |
class CBaseEvent | |
{ | |
protected: | |
::CEvent _object; | |
public: | |
bool IsCreated() { return Event_IsCreated(&_object) != 0; } | |
operator HANDLE() { return _object; } | |
CBaseEvent() { Event_Construct(&_object); } | |
~CBaseEvent() { Close(); } | |
WRes Close() { return Event_Close(&_object); } | |
#ifdef _WIN32 | |
WRes Create(bool manualReset, bool initiallyOwn, LPCTSTR name = NULL, LPSECURITY_ATTRIBUTES sa = NULL) | |
{ | |
_object = ::CreateEvent(sa, BoolToBOOL(manualReset), BoolToBOOL(initiallyOwn), name); | |
if (name == NULL && _object != 0) | |
return 0; | |
return ::GetLastError(); | |
} | |
WRes Open(DWORD desiredAccess, bool inheritHandle, LPCTSTR name) | |
{ | |
_object = ::OpenEvent(desiredAccess, BoolToBOOL(inheritHandle), name); | |
if (_object != 0) | |
return 0; | |
return ::GetLastError(); | |
} | |
#endif | |
WRes Set() { return Event_Set(&_object); } | |
// bool Pulse() { return BOOLToBool(::PulseEvent(_handle)); } | |
WRes Reset() { return Event_Reset(&_object); } | |
WRes Lock() { return Event_Wait(&_object); } | |
}; | |
class CManualResetEvent: public CBaseEvent | |
{ | |
public: | |
WRes Create(bool initiallyOwn = false) | |
{ | |
return ManualResetEvent_Create(&_object, initiallyOwn ? 1: 0); | |
} | |
WRes CreateIfNotCreated() | |
{ | |
if (IsCreated()) | |
return 0; | |
return ManualResetEvent_CreateNotSignaled(&_object); | |
} | |
#ifdef _WIN32 | |
WRes CreateWithName(bool initiallyOwn, LPCTSTR name) | |
{ | |
return CBaseEvent::Create(true, initiallyOwn, name); | |
} | |
#endif | |
}; | |
class CAutoResetEvent: public CBaseEvent | |
{ | |
public: | |
WRes Create() | |
{ | |
return AutoResetEvent_CreateNotSignaled(&_object); | |
} | |
WRes CreateIfNotCreated() | |
{ | |
if (IsCreated()) | |
return 0; | |
return AutoResetEvent_CreateNotSignaled(&_object); | |
} | |
}; | |
#ifdef _WIN32 | |
class CObject: public CHandle | |
{ | |
public: | |
WRes Lock(DWORD timeoutInterval = INFINITE) | |
{ return (::WaitForSingleObject(_handle, timeoutInterval) == WAIT_OBJECT_0 ? 0 : ::GetLastError()); } | |
}; | |
class CMutex: public CObject | |
{ | |
public: | |
WRes Create(bool initiallyOwn, LPCTSTR name = NULL, LPSECURITY_ATTRIBUTES sa = NULL) | |
{ | |
_handle = ::CreateMutex(sa, BoolToBOOL(initiallyOwn), name); | |
if (name == NULL && _handle != 0) | |
return 0; | |
return ::GetLastError(); | |
} | |
#ifndef UNDER_CE | |
WRes Open(DWORD desiredAccess, bool inheritHandle, LPCTSTR name) | |
{ | |
_handle = ::OpenMutex(desiredAccess, BoolToBOOL(inheritHandle), name); | |
if (_handle != 0) | |
return 0; | |
return ::GetLastError(); | |
} | |
#endif | |
WRes Release() | |
{ | |
return ::ReleaseMutex(_handle) ? 0 : ::GetLastError(); | |
} | |
}; | |
class CMutexLock | |
{ | |
CMutex *_object; | |
public: | |
CMutexLock(CMutex &object): _object(&object) { _object->Lock(); } | |
~CMutexLock() { _object->Release(); } | |
}; | |
#endif | |
class CSemaphore | |
{ | |
::CSemaphore _object; | |
public: | |
CSemaphore() { Semaphore_Construct(&_object); } | |
~CSemaphore() { Close(); } | |
WRes Close() { return Semaphore_Close(&_object); } | |
operator HANDLE() { return _object; } | |
WRes Create(UInt32 initiallyCount, UInt32 maxCount) | |
{ | |
return Semaphore_Create(&_object, initiallyCount, maxCount); | |
} | |
WRes Release() { return Semaphore_Release1(&_object); } | |
WRes Release(UInt32 releaseCount) { return Semaphore_ReleaseN(&_object, releaseCount); } | |
WRes Lock() { return Semaphore_Wait(&_object); } | |
}; | |
class CCriticalSection | |
{ | |
::CCriticalSection _object; | |
public: | |
CCriticalSection() { CriticalSection_Init(&_object); } | |
~CCriticalSection() { CriticalSection_Delete(&_object); } | |
void Enter() { CriticalSection_Enter(&_object); } | |
void Leave() { CriticalSection_Leave(&_object); } | |
}; | |
class CCriticalSectionLock | |
{ | |
CCriticalSection *_object; | |
void Unlock() { _object->Leave(); } | |
public: | |
CCriticalSectionLock(CCriticalSection &object): _object(&object) {_object->Enter(); } | |
~CCriticalSectionLock() { Unlock(); } | |
}; | |
}} | |
#endif |