1 // Windows/Synchronization.h
\r
3 #ifndef __WINDOWS_SYNCHRONIZATION_H
\r
4 #define __WINDOWS_SYNCHRONIZATION_H
\r
6 #include "../../C/Threads.h"
\r
14 namespace NWindows {
\r
15 namespace NSynchronization {
\r
22 bool IsCreated() { return Event_IsCreated(&_object) != 0; }
\r
23 operator HANDLE() { return _object; }
\r
24 CBaseEvent() { Event_Construct(&_object); }
\r
25 ~CBaseEvent() { Close(); }
\r
26 WRes Close() { return Event_Close(&_object); }
\r
28 WRes Create(bool manualReset, bool initiallyOwn, LPCTSTR name = NULL, LPSECURITY_ATTRIBUTES sa = NULL)
\r
30 _object = ::CreateEvent(sa, BoolToBOOL(manualReset), BoolToBOOL(initiallyOwn), name);
\r
31 if (name == NULL && _object != 0)
\r
33 return ::GetLastError();
\r
35 WRes Open(DWORD desiredAccess, bool inheritHandle, LPCTSTR name)
\r
37 _object = ::OpenEvent(desiredAccess, BoolToBOOL(inheritHandle), name);
\r
40 return ::GetLastError();
\r
44 WRes Set() { return Event_Set(&_object); }
\r
45 // bool Pulse() { return BOOLToBool(::PulseEvent(_handle)); }
\r
46 WRes Reset() { return Event_Reset(&_object); }
\r
47 WRes Lock() { return Event_Wait(&_object); }
\r
50 class CManualResetEvent: public CBaseEvent
\r
53 WRes Create(bool initiallyOwn = false)
\r
55 return ManualResetEvent_Create(&_object, initiallyOwn ? 1: 0);
\r
57 WRes CreateIfNotCreated()
\r
61 return ManualResetEvent_CreateNotSignaled(&_object);
\r
64 WRes CreateWithName(bool initiallyOwn, LPCTSTR name)
\r
66 return CBaseEvent::Create(true, initiallyOwn, name);
\r
71 class CAutoResetEvent: public CBaseEvent
\r
76 return AutoResetEvent_CreateNotSignaled(&_object);
\r
78 WRes CreateIfNotCreated()
\r
82 return AutoResetEvent_CreateNotSignaled(&_object);
\r
87 class CObject: public CHandle
\r
90 WRes Lock(DWORD timeoutInterval = INFINITE)
\r
91 { return (::WaitForSingleObject(_handle, timeoutInterval) == WAIT_OBJECT_0 ? 0 : ::GetLastError()); }
\r
93 class CMutex: public CObject
\r
96 WRes Create(bool initiallyOwn, LPCTSTR name = NULL, LPSECURITY_ATTRIBUTES sa = NULL)
\r
98 _handle = ::CreateMutex(sa, BoolToBOOL(initiallyOwn), name);
\r
99 if (name == NULL && _handle != 0)
\r
101 return ::GetLastError();
\r
104 WRes Open(DWORD desiredAccess, bool inheritHandle, LPCTSTR name)
\r
106 _handle = ::OpenMutex(desiredAccess, BoolToBOOL(inheritHandle), name);
\r
109 return ::GetLastError();
\r
114 return ::ReleaseMutex(_handle) ? 0 : ::GetLastError();
\r
121 CMutexLock(CMutex &object): _object(&object) { _object->Lock(); }
\r
122 ~CMutexLock() { _object->Release(); }
\r
128 ::CSemaphore _object;
\r
130 CSemaphore() { Semaphore_Construct(&_object); }
\r
131 ~CSemaphore() { Close(); }
\r
132 WRes Close() { return Semaphore_Close(&_object); }
\r
133 operator HANDLE() { return _object; }
\r
134 WRes Create(UInt32 initiallyCount, UInt32 maxCount)
\r
136 return Semaphore_Create(&_object, initiallyCount, maxCount);
\r
138 WRes Release() { return Semaphore_Release1(&_object); }
\r
139 WRes Release(UInt32 releaseCount) { return Semaphore_ReleaseN(&_object, releaseCount); }
\r
140 WRes Lock() { return Semaphore_Wait(&_object); }
\r
143 class CCriticalSection
\r
145 ::CCriticalSection _object;
\r
147 CCriticalSection() { CriticalSection_Init(&_object); }
\r
148 ~CCriticalSection() { CriticalSection_Delete(&_object); }
\r
149 void Enter() { CriticalSection_Enter(&_object); }
\r
150 void Leave() { CriticalSection_Leave(&_object); }
\r
153 class CCriticalSectionLock
\r
155 CCriticalSection *_object;
\r
156 void Unlock() { _object->Leave(); }
\r
158 CCriticalSectionLock(CCriticalSection &object): _object(&object) {_object->Enter(); }
\r
159 ~CCriticalSectionLock() { Unlock(); }
\r