Source code

Revision control

Copy as Markdown

Other Tools

// 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