diff options
Diffstat (limited to 'CPP/Windows/Synchronization.h')
-rwxr-xr-x | CPP/Windows/Synchronization.h | 151 |
1 files changed, 93 insertions, 58 deletions
diff --git a/CPP/Windows/Synchronization.h b/CPP/Windows/Synchronization.h index 89450276..c16f7b4d 100755 --- a/CPP/Windows/Synchronization.h +++ b/CPP/Windows/Synchronization.h @@ -4,81 +4,120 @@ #define __WINDOWS_SYNCHRONIZATION_H #include "Defs.h" + +extern "C" +{ +#include "../../C/Threads.h" +} + +#ifdef _WIN32 #include "Handle.h" +#endif namespace NWindows { namespace NSynchronization { -class CObject: public CHandle -{ -public: - bool Lock(DWORD timeoutInterval = INFINITE) - { return (::WaitForSingleObject(_handle, timeoutInterval) == WAIT_OBJECT_0); } -}; - -class CBaseEvent: public CObject +class CBaseEvent { +protected: + ::CEvent _object; public: - bool Create(bool manualReset, bool initiallyOwn, LPCTSTR name = NULL, + bool IsCreated() { return Event_IsCreated(&_object) != 0; } + operator HANDLE() { return _object.handle; } + CBaseEvent() { Event_Construct(&_object); } + ~CBaseEvent() { Close(); } + HRes Close() { return Event_Close(&_object); } + #ifdef _WIN32 + HRes Create(bool manualReset, bool initiallyOwn, LPCTSTR name = NULL, LPSECURITY_ATTRIBUTES securityAttributes = NULL) { - _handle = ::CreateEvent(securityAttributes, BoolToBOOL(manualReset), + _object.handle = ::CreateEvent(securityAttributes, BoolToBOOL(manualReset), BoolToBOOL(initiallyOwn), name); - return (_handle != 0); + if (_object.handle != 0) + return 0; + return ::GetLastError(); } - - bool Open(DWORD desiredAccess, bool inheritHandle, LPCTSTR name) + HRes Open(DWORD desiredAccess, bool inheritHandle, LPCTSTR name) { - _handle = ::OpenEvent(desiredAccess, BoolToBOOL(inheritHandle), name); - return (_handle != 0); + _object.handle = ::OpenEvent(desiredAccess, BoolToBOOL(inheritHandle), name); + if (_object.handle != 0) + return 0; + return ::GetLastError(); } + #endif - bool Set() { return BOOLToBool(::SetEvent(_handle)); } - bool Pulse() { return BOOLToBool(::PulseEvent(_handle)); } - bool Reset() { return BOOLToBool(::ResetEvent(_handle)); } + HRes Set() { return Event_Set(&_object); } + // bool Pulse() { return BOOLToBool(::PulseEvent(_handle)); } + HRes Reset() { return Event_Reset(&_object); } + HRes Lock() { return Event_Wait(&_object); } }; -class CEvent: public CBaseEvent +class CManualResetEvent: public CBaseEvent { public: - CEvent() {}; - CEvent(bool manualReset, bool initiallyOwn, - LPCTSTR name = NULL, LPSECURITY_ATTRIBUTES securityAttributes = NULL); + HRes Create(bool initiallyOwn = false) + { + return ManualResetEvent_Create(&_object, initiallyOwn ? 1: 0); + } + HRes CreateIfNotCreated() + { + if (IsCreated()) + return 0; + return ManualResetEvent_CreateNotSignaled(&_object); + } + #ifdef _WIN32 + HRes CreateWithName(bool initiallyOwn, LPCTSTR name) + { + return CBaseEvent::Create(true, initiallyOwn, name); + } + #endif }; -class CManualResetEvent: public CEvent +class CAutoResetEvent: public CBaseEvent { public: - CManualResetEvent(bool initiallyOwn = false, LPCTSTR name = NULL, - LPSECURITY_ATTRIBUTES securityAttributes = NULL): - CEvent(true, initiallyOwn, name, securityAttributes) {}; + HRes Create() + { + return AutoResetEvent_CreateNotSignaled(&_object); + } + HRes CreateIfNotCreated() + { + if (IsCreated()) + return 0; + return AutoResetEvent_CreateNotSignaled(&_object); + } }; -class CAutoResetEvent: public CEvent +#ifdef _WIN32 +class CObject: public CHandle { public: - CAutoResetEvent(bool initiallyOwn = false, LPCTSTR name = NULL, - LPSECURITY_ATTRIBUTES securityAttributes = NULL): - CEvent(false, initiallyOwn, name, securityAttributes) {}; + HRes Lock(DWORD timeoutInterval = INFINITE) + { return (::WaitForSingleObject(_handle, timeoutInterval) == WAIT_OBJECT_0 ? 0 : ::GetLastError()); } }; - class CMutex: public CObject { public: - bool Create(bool initiallyOwn, LPCTSTR name = NULL, + HRes Create(bool initiallyOwn, LPCTSTR name = NULL, LPSECURITY_ATTRIBUTES securityAttributes = NULL) { _handle = ::CreateMutex(securityAttributes, BoolToBOOL(initiallyOwn), name); - return (_handle != 0); + if (_handle != 0) + return 0; + return ::GetLastError(); } - bool Open(DWORD desiredAccess, bool inheritHandle, LPCTSTR name) + HRes Open(DWORD desiredAccess, bool inheritHandle, LPCTSTR name) { _handle = ::OpenMutex(desiredAccess, BoolToBOOL(inheritHandle), name); - return (_handle != 0); + if (_handle != 0) + return 0; + return ::GetLastError(); + } + HRes Release() + { + return ::ReleaseMutex(_handle) ? 0 : ::GetLastError(); } - bool Release() { return BOOLToBool(::ReleaseMutex(_handle)); } }; - class CMutexLock { CMutex *_object; @@ -86,37 +125,33 @@ public: CMutexLock(CMutex &object): _object(&object) { _object->Lock(); } ~CMutexLock() { _object->Release(); } }; +#endif -class CSemaphore: public CObject +class CSemaphore { + ::CSemaphore _object; public: - bool Create(LONG initiallyCount, LONG maxCount, LPCTSTR name = NULL, - LPSECURITY_ATTRIBUTES securityAttributes = NULL) + CSemaphore() { Semaphore_Construct(&_object); } + ~CSemaphore() { Close(); } + HRes Close() { return Semaphore_Close(&_object); } + operator HANDLE() { return _object.handle; } + HRes Create(UInt32 initiallyCount, UInt32 maxCount) { - _handle = ::CreateSemaphore(securityAttributes, initiallyCount, maxCount, name); - return (_handle != 0); - } - bool Open(DWORD desiredAccess, bool inheritHandle, LPCTSTR name) - { - _handle = ::OpenSemaphore(desiredAccess, BoolToBOOL(inheritHandle), name); - return (_handle != 0); - } - bool Release(LONG releaseCount = 1, LPLONG previousCount = NULL) - { - return BOOLToBool(::ReleaseSemaphore(_handle, releaseCount, previousCount)); + return Semaphore_Create(&_object, initiallyCount, maxCount); } + HRes Release() { return Semaphore_Release1(&_object); } + HRes Release(UInt32 releaseCount) { return Semaphore_ReleaseN(&_object, releaseCount); } + HRes Lock() { return Semaphore_Wait(&_object); } }; class CCriticalSection { - CRITICAL_SECTION _object; - // void Initialize() { ::InitializeCriticalSection(&_object); } - // void Delete() { ::DeleteCriticalSection(&_object); } + ::CCriticalSection _object; public: - CCriticalSection() { ::InitializeCriticalSection(&_object); } - ~CCriticalSection() { ::DeleteCriticalSection(&_object); } - void Enter() { ::EnterCriticalSection(&_object); } - void Leave() { ::LeaveCriticalSection(&_object); } + CCriticalSection() { CriticalSection_Init(&_object); } + ~CCriticalSection() { CriticalSection_Delete(&_object); } + void Enter() { CriticalSection_Enter(&_object); } + void Leave() { CriticalSection_Leave(&_object); } }; class CCriticalSectionLock |