1*f6dc9357SAndroid Build Coastguard Worker // Windows/Synchronization.h
2*f6dc9357SAndroid Build Coastguard Worker
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_WINDOWS_SYNCHRONIZATION_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_WINDOWS_SYNCHRONIZATION_H
5*f6dc9357SAndroid Build Coastguard Worker
6*f6dc9357SAndroid Build Coastguard Worker #include "../../C/Threads.h"
7*f6dc9357SAndroid Build Coastguard Worker
8*f6dc9357SAndroid Build Coastguard Worker #include "../Common/MyTypes.h"
9*f6dc9357SAndroid Build Coastguard Worker
10*f6dc9357SAndroid Build Coastguard Worker #include "Defs.h"
11*f6dc9357SAndroid Build Coastguard Worker
12*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
13*f6dc9357SAndroid Build Coastguard Worker #include "Handle.h"
14*f6dc9357SAndroid Build Coastguard Worker #endif
15*f6dc9357SAndroid Build Coastguard Worker
16*f6dc9357SAndroid Build Coastguard Worker namespace NWindows {
17*f6dc9357SAndroid Build Coastguard Worker namespace NSynchronization {
18*f6dc9357SAndroid Build Coastguard Worker
19*f6dc9357SAndroid Build Coastguard Worker class CBaseEvent MY_UNCOPYABLE
20*f6dc9357SAndroid Build Coastguard Worker {
21*f6dc9357SAndroid Build Coastguard Worker protected:
22*f6dc9357SAndroid Build Coastguard Worker ::CEvent _object;
23*f6dc9357SAndroid Build Coastguard Worker public:
IsCreated()24*f6dc9357SAndroid Build Coastguard Worker bool IsCreated() { return Event_IsCreated(&_object) != 0; }
25*f6dc9357SAndroid Build Coastguard Worker
CBaseEvent()26*f6dc9357SAndroid Build Coastguard Worker CBaseEvent() { Event_Construct(&_object); }
~CBaseEvent()27*f6dc9357SAndroid Build Coastguard Worker ~CBaseEvent() { Close(); }
Close()28*f6dc9357SAndroid Build Coastguard Worker WRes Close() { return Event_Close(&_object); }
29*f6dc9357SAndroid Build Coastguard Worker
30*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
HANDLE()31*f6dc9357SAndroid Build Coastguard Worker operator HANDLE() { return _object; }
32*f6dc9357SAndroid Build Coastguard Worker WRes Create(bool manualReset, bool initiallyOwn, LPCTSTR name = NULL, LPSECURITY_ATTRIBUTES sa = NULL)
33*f6dc9357SAndroid Build Coastguard Worker {
34*f6dc9357SAndroid Build Coastguard Worker _object = ::CreateEvent(sa, BoolToBOOL(manualReset), BoolToBOOL(initiallyOwn), name);
35*f6dc9357SAndroid Build Coastguard Worker if (name == NULL && _object != NULL)
36*f6dc9357SAndroid Build Coastguard Worker return 0;
37*f6dc9357SAndroid Build Coastguard Worker return ::GetLastError();
38*f6dc9357SAndroid Build Coastguard Worker }
Open(DWORD desiredAccess,bool inheritHandle,LPCTSTR name)39*f6dc9357SAndroid Build Coastguard Worker WRes Open(DWORD desiredAccess, bool inheritHandle, LPCTSTR name)
40*f6dc9357SAndroid Build Coastguard Worker {
41*f6dc9357SAndroid Build Coastguard Worker _object = ::OpenEvent(desiredAccess, BoolToBOOL(inheritHandle), name);
42*f6dc9357SAndroid Build Coastguard Worker if (_object != NULL)
43*f6dc9357SAndroid Build Coastguard Worker return 0;
44*f6dc9357SAndroid Build Coastguard Worker return ::GetLastError();
45*f6dc9357SAndroid Build Coastguard Worker }
46*f6dc9357SAndroid Build Coastguard Worker #endif
47*f6dc9357SAndroid Build Coastguard Worker
Set()48*f6dc9357SAndroid Build Coastguard Worker WRes Set() { return Event_Set(&_object); }
49*f6dc9357SAndroid Build Coastguard Worker // bool Pulse() { return BOOLToBool(::PulseEvent(_handle)); }
Reset()50*f6dc9357SAndroid Build Coastguard Worker WRes Reset() { return Event_Reset(&_object); }
Lock()51*f6dc9357SAndroid Build Coastguard Worker WRes Lock() { return Event_Wait(&_object); }
52*f6dc9357SAndroid Build Coastguard Worker };
53*f6dc9357SAndroid Build Coastguard Worker
54*f6dc9357SAndroid Build Coastguard Worker class CManualResetEvent: public CBaseEvent
55*f6dc9357SAndroid Build Coastguard Worker {
56*f6dc9357SAndroid Build Coastguard Worker public:
57*f6dc9357SAndroid Build Coastguard Worker WRes Create(bool initiallyOwn = false)
58*f6dc9357SAndroid Build Coastguard Worker {
59*f6dc9357SAndroid Build Coastguard Worker return ManualResetEvent_Create(&_object, initiallyOwn ? 1: 0);
60*f6dc9357SAndroid Build Coastguard Worker }
CreateIfNotCreated_Reset()61*f6dc9357SAndroid Build Coastguard Worker WRes CreateIfNotCreated_Reset()
62*f6dc9357SAndroid Build Coastguard Worker {
63*f6dc9357SAndroid Build Coastguard Worker if (IsCreated())
64*f6dc9357SAndroid Build Coastguard Worker return Reset();
65*f6dc9357SAndroid Build Coastguard Worker return ManualResetEvent_CreateNotSignaled(&_object);
66*f6dc9357SAndroid Build Coastguard Worker }
67*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
CreateWithName(bool initiallyOwn,LPCTSTR name)68*f6dc9357SAndroid Build Coastguard Worker WRes CreateWithName(bool initiallyOwn, LPCTSTR name)
69*f6dc9357SAndroid Build Coastguard Worker {
70*f6dc9357SAndroid Build Coastguard Worker return CBaseEvent::Create(true, initiallyOwn, name);
71*f6dc9357SAndroid Build Coastguard Worker }
72*f6dc9357SAndroid Build Coastguard Worker #endif
73*f6dc9357SAndroid Build Coastguard Worker };
74*f6dc9357SAndroid Build Coastguard Worker
75*f6dc9357SAndroid Build Coastguard Worker class CAutoResetEvent: public CBaseEvent
76*f6dc9357SAndroid Build Coastguard Worker {
77*f6dc9357SAndroid Build Coastguard Worker public:
Create()78*f6dc9357SAndroid Build Coastguard Worker WRes Create()
79*f6dc9357SAndroid Build Coastguard Worker {
80*f6dc9357SAndroid Build Coastguard Worker return AutoResetEvent_CreateNotSignaled(&_object);
81*f6dc9357SAndroid Build Coastguard Worker }
CreateIfNotCreated_Reset()82*f6dc9357SAndroid Build Coastguard Worker WRes CreateIfNotCreated_Reset()
83*f6dc9357SAndroid Build Coastguard Worker {
84*f6dc9357SAndroid Build Coastguard Worker if (IsCreated())
85*f6dc9357SAndroid Build Coastguard Worker return Reset();
86*f6dc9357SAndroid Build Coastguard Worker return AutoResetEvent_CreateNotSignaled(&_object);
87*f6dc9357SAndroid Build Coastguard Worker }
88*f6dc9357SAndroid Build Coastguard Worker };
89*f6dc9357SAndroid Build Coastguard Worker
90*f6dc9357SAndroid Build Coastguard Worker
91*f6dc9357SAndroid Build Coastguard Worker /*
92*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
93*f6dc9357SAndroid Build Coastguard Worker
94*f6dc9357SAndroid Build Coastguard Worker class CObject: public CHandle
95*f6dc9357SAndroid Build Coastguard Worker {
96*f6dc9357SAndroid Build Coastguard Worker public:
97*f6dc9357SAndroid Build Coastguard Worker WRes Lock(DWORD timeoutInterval = INFINITE)
98*f6dc9357SAndroid Build Coastguard Worker { return (::WaitForSingleObject(_handle, timeoutInterval) == WAIT_OBJECT_0 ? 0 : ::GetLastError()); }
99*f6dc9357SAndroid Build Coastguard Worker };
100*f6dc9357SAndroid Build Coastguard Worker
101*f6dc9357SAndroid Build Coastguard Worker class CMutex: public CObject
102*f6dc9357SAndroid Build Coastguard Worker {
103*f6dc9357SAndroid Build Coastguard Worker public:
104*f6dc9357SAndroid Build Coastguard Worker WRes Create(bool initiallyOwn, LPCTSTR name = NULL, LPSECURITY_ATTRIBUTES sa = NULL)
105*f6dc9357SAndroid Build Coastguard Worker {
106*f6dc9357SAndroid Build Coastguard Worker _handle = ::CreateMutex(sa, BoolToBOOL(initiallyOwn), name);
107*f6dc9357SAndroid Build Coastguard Worker if (name == NULL && _handle != 0)
108*f6dc9357SAndroid Build Coastguard Worker return 0;
109*f6dc9357SAndroid Build Coastguard Worker return ::GetLastError();
110*f6dc9357SAndroid Build Coastguard Worker }
111*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE
112*f6dc9357SAndroid Build Coastguard Worker WRes Open(DWORD desiredAccess, bool inheritHandle, LPCTSTR name)
113*f6dc9357SAndroid Build Coastguard Worker {
114*f6dc9357SAndroid Build Coastguard Worker _handle = ::OpenMutex(desiredAccess, BoolToBOOL(inheritHandle), name);
115*f6dc9357SAndroid Build Coastguard Worker if (_handle != 0)
116*f6dc9357SAndroid Build Coastguard Worker return 0;
117*f6dc9357SAndroid Build Coastguard Worker return ::GetLastError();
118*f6dc9357SAndroid Build Coastguard Worker }
119*f6dc9357SAndroid Build Coastguard Worker #endif
120*f6dc9357SAndroid Build Coastguard Worker WRes Release()
121*f6dc9357SAndroid Build Coastguard Worker {
122*f6dc9357SAndroid Build Coastguard Worker return ::ReleaseMutex(_handle) ? 0 : ::GetLastError();
123*f6dc9357SAndroid Build Coastguard Worker }
124*f6dc9357SAndroid Build Coastguard Worker };
125*f6dc9357SAndroid Build Coastguard Worker
126*f6dc9357SAndroid Build Coastguard Worker class CMutexLock MY_UNCOPYABLE
127*f6dc9357SAndroid Build Coastguard Worker {
128*f6dc9357SAndroid Build Coastguard Worker CMutex *_object;
129*f6dc9357SAndroid Build Coastguard Worker public:
130*f6dc9357SAndroid Build Coastguard Worker CMutexLock(CMutex &object): _object(&object) { _object->Lock(); }
131*f6dc9357SAndroid Build Coastguard Worker ~CMutexLock() { _object->Release(); }
132*f6dc9357SAndroid Build Coastguard Worker };
133*f6dc9357SAndroid Build Coastguard Worker
134*f6dc9357SAndroid Build Coastguard Worker #endif // _WIN32
135*f6dc9357SAndroid Build Coastguard Worker */
136*f6dc9357SAndroid Build Coastguard Worker
137*f6dc9357SAndroid Build Coastguard Worker
138*f6dc9357SAndroid Build Coastguard Worker class CSemaphore MY_UNCOPYABLE
139*f6dc9357SAndroid Build Coastguard Worker {
140*f6dc9357SAndroid Build Coastguard Worker ::CSemaphore _object;
141*f6dc9357SAndroid Build Coastguard Worker public:
CSemaphore()142*f6dc9357SAndroid Build Coastguard Worker CSemaphore() { Semaphore_Construct(&_object); }
~CSemaphore()143*f6dc9357SAndroid Build Coastguard Worker ~CSemaphore() { Close(); }
Close()144*f6dc9357SAndroid Build Coastguard Worker WRes Close() { return Semaphore_Close(&_object); }
145*f6dc9357SAndroid Build Coastguard Worker
146*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
HANDLE()147*f6dc9357SAndroid Build Coastguard Worker operator HANDLE() { return _object; }
148*f6dc9357SAndroid Build Coastguard Worker #endif
149*f6dc9357SAndroid Build Coastguard Worker
150*f6dc9357SAndroid Build Coastguard Worker // bool IsCreated() const { return Semaphore_IsCreated(&_object) != 0; }
151*f6dc9357SAndroid Build Coastguard Worker
Create(UInt32 initCount,UInt32 maxCount)152*f6dc9357SAndroid Build Coastguard Worker WRes Create(UInt32 initCount, UInt32 maxCount)
153*f6dc9357SAndroid Build Coastguard Worker {
154*f6dc9357SAndroid Build Coastguard Worker return Semaphore_Create(&_object, initCount, maxCount);
155*f6dc9357SAndroid Build Coastguard Worker }
OptCreateInit(UInt32 initCount,UInt32 maxCount)156*f6dc9357SAndroid Build Coastguard Worker WRes OptCreateInit(UInt32 initCount, UInt32 maxCount)
157*f6dc9357SAndroid Build Coastguard Worker {
158*f6dc9357SAndroid Build Coastguard Worker return Semaphore_OptCreateInit(&_object, initCount, maxCount);
159*f6dc9357SAndroid Build Coastguard Worker }
Release()160*f6dc9357SAndroid Build Coastguard Worker WRes Release() { return Semaphore_Release1(&_object); }
Release(UInt32 releaseCount)161*f6dc9357SAndroid Build Coastguard Worker WRes Release(UInt32 releaseCount) { return Semaphore_ReleaseN(&_object, releaseCount); }
Lock()162*f6dc9357SAndroid Build Coastguard Worker WRes Lock() { return Semaphore_Wait(&_object); }
163*f6dc9357SAndroid Build Coastguard Worker };
164*f6dc9357SAndroid Build Coastguard Worker
165*f6dc9357SAndroid Build Coastguard Worker class CCriticalSection MY_UNCOPYABLE
166*f6dc9357SAndroid Build Coastguard Worker {
167*f6dc9357SAndroid Build Coastguard Worker ::CCriticalSection _object;
168*f6dc9357SAndroid Build Coastguard Worker public:
CCriticalSection()169*f6dc9357SAndroid Build Coastguard Worker CCriticalSection() { CriticalSection_Init(&_object); }
~CCriticalSection()170*f6dc9357SAndroid Build Coastguard Worker ~CCriticalSection() { CriticalSection_Delete(&_object); }
Enter()171*f6dc9357SAndroid Build Coastguard Worker void Enter() { CriticalSection_Enter(&_object); }
Leave()172*f6dc9357SAndroid Build Coastguard Worker void Leave() { CriticalSection_Leave(&_object); }
173*f6dc9357SAndroid Build Coastguard Worker };
174*f6dc9357SAndroid Build Coastguard Worker
175*f6dc9357SAndroid Build Coastguard Worker class CCriticalSectionLock MY_UNCOPYABLE
176*f6dc9357SAndroid Build Coastguard Worker {
177*f6dc9357SAndroid Build Coastguard Worker CCriticalSection *_object;
Unlock()178*f6dc9357SAndroid Build Coastguard Worker void Unlock() { _object->Leave(); }
179*f6dc9357SAndroid Build Coastguard Worker public:
CCriticalSectionLock(CCriticalSection & object)180*f6dc9357SAndroid Build Coastguard Worker CCriticalSectionLock(CCriticalSection &object): _object(&object) {_object->Enter(); }
~CCriticalSectionLock()181*f6dc9357SAndroid Build Coastguard Worker ~CCriticalSectionLock() { Unlock(); }
182*f6dc9357SAndroid Build Coastguard Worker };
183*f6dc9357SAndroid Build Coastguard Worker
184*f6dc9357SAndroid Build Coastguard Worker
185*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
186*f6dc9357SAndroid Build Coastguard Worker
187*f6dc9357SAndroid Build Coastguard Worker typedef HANDLE CHandle_WFMO;
188*f6dc9357SAndroid Build Coastguard Worker typedef CSemaphore CSemaphore_WFMO;
189*f6dc9357SAndroid Build Coastguard Worker typedef CAutoResetEvent CAutoResetEvent_WFMO;
190*f6dc9357SAndroid Build Coastguard Worker typedef CManualResetEvent CManualResetEvent_WFMO;
191*f6dc9357SAndroid Build Coastguard Worker
WaitForMultiObj_Any_Infinite(DWORD count,const CHandle_WFMO * handles)192*f6dc9357SAndroid Build Coastguard Worker inline DWORD WINAPI WaitForMultiObj_Any_Infinite(DWORD count, const CHandle_WFMO *handles)
193*f6dc9357SAndroid Build Coastguard Worker {
194*f6dc9357SAndroid Build Coastguard Worker return ::WaitForMultipleObjects(count, handles, FALSE, INFINITE);
195*f6dc9357SAndroid Build Coastguard Worker }
196*f6dc9357SAndroid Build Coastguard Worker
197*f6dc9357SAndroid Build Coastguard Worker #define SYNC_OBJ_DECL(obj)
198*f6dc9357SAndroid Build Coastguard Worker #define SYNC_WFMO(x)
199*f6dc9357SAndroid Build Coastguard Worker #define SYNC_PARAM(x)
200*f6dc9357SAndroid Build Coastguard Worker #define SYNC_PARAM_DECL(x)
201*f6dc9357SAndroid Build Coastguard Worker
202*f6dc9357SAndroid Build Coastguard Worker #else // _WIN32
203*f6dc9357SAndroid Build Coastguard Worker
204*f6dc9357SAndroid Build Coastguard Worker // POSIX sync objects for WaitForMultipleObjects
205*f6dc9357SAndroid Build Coastguard Worker
206*f6dc9357SAndroid Build Coastguard Worker #define SYNC_WFMO(x) x
207*f6dc9357SAndroid Build Coastguard Worker #define SYNC_PARAM(x) x,
208*f6dc9357SAndroid Build Coastguard Worker #define SYNC_PARAM_DECL(x) NWindows::NSynchronization::CSynchro *x
209*f6dc9357SAndroid Build Coastguard Worker #define SYNC_OBJ_DECL(x) NWindows::NSynchronization::CSynchro x;
210*f6dc9357SAndroid Build Coastguard Worker
211*f6dc9357SAndroid Build Coastguard Worker class CSynchro MY_UNCOPYABLE
212*f6dc9357SAndroid Build Coastguard Worker {
213*f6dc9357SAndroid Build Coastguard Worker pthread_mutex_t _mutex;
214*f6dc9357SAndroid Build Coastguard Worker pthread_cond_t _cond;
215*f6dc9357SAndroid Build Coastguard Worker bool _isValid;
216*f6dc9357SAndroid Build Coastguard Worker
217*f6dc9357SAndroid Build Coastguard Worker public:
CSynchro()218*f6dc9357SAndroid Build Coastguard Worker CSynchro() { _isValid = false; }
~CSynchro()219*f6dc9357SAndroid Build Coastguard Worker ~CSynchro()
220*f6dc9357SAndroid Build Coastguard Worker {
221*f6dc9357SAndroid Build Coastguard Worker if (_isValid)
222*f6dc9357SAndroid Build Coastguard Worker {
223*f6dc9357SAndroid Build Coastguard Worker ::pthread_mutex_destroy(&_mutex);
224*f6dc9357SAndroid Build Coastguard Worker ::pthread_cond_destroy(&_cond);
225*f6dc9357SAndroid Build Coastguard Worker }
226*f6dc9357SAndroid Build Coastguard Worker _isValid = false;
227*f6dc9357SAndroid Build Coastguard Worker }
Create()228*f6dc9357SAndroid Build Coastguard Worker WRes Create()
229*f6dc9357SAndroid Build Coastguard Worker {
230*f6dc9357SAndroid Build Coastguard Worker RINOK(::pthread_mutex_init(&_mutex, NULL))
231*f6dc9357SAndroid Build Coastguard Worker const WRes ret = ::pthread_cond_init(&_cond, NULL);
232*f6dc9357SAndroid Build Coastguard Worker _isValid = 1;
233*f6dc9357SAndroid Build Coastguard Worker return ret;
234*f6dc9357SAndroid Build Coastguard Worker }
Enter()235*f6dc9357SAndroid Build Coastguard Worker WRes Enter()
236*f6dc9357SAndroid Build Coastguard Worker {
237*f6dc9357SAndroid Build Coastguard Worker #if defined(Z7_LLVM_CLANG_VERSION) && (__clang_major__ == 13) \
238*f6dc9357SAndroid Build Coastguard Worker && defined(__FreeBSD__)
239*f6dc9357SAndroid Build Coastguard Worker #pragma GCC diagnostic ignored "-Wthread-safety-negative"
240*f6dc9357SAndroid Build Coastguard Worker #pragma GCC diagnostic ignored "-Wthread-safety-analysis"
241*f6dc9357SAndroid Build Coastguard Worker #endif
242*f6dc9357SAndroid Build Coastguard Worker return ::pthread_mutex_lock(&_mutex);
243*f6dc9357SAndroid Build Coastguard Worker }
Leave()244*f6dc9357SAndroid Build Coastguard Worker WRes Leave()
245*f6dc9357SAndroid Build Coastguard Worker {
246*f6dc9357SAndroid Build Coastguard Worker return ::pthread_mutex_unlock(&_mutex);
247*f6dc9357SAndroid Build Coastguard Worker }
WaitCond()248*f6dc9357SAndroid Build Coastguard Worker WRes WaitCond()
249*f6dc9357SAndroid Build Coastguard Worker {
250*f6dc9357SAndroid Build Coastguard Worker return ::pthread_cond_wait(&_cond, &_mutex);
251*f6dc9357SAndroid Build Coastguard Worker }
LeaveAndSignal()252*f6dc9357SAndroid Build Coastguard Worker WRes LeaveAndSignal()
253*f6dc9357SAndroid Build Coastguard Worker {
254*f6dc9357SAndroid Build Coastguard Worker const WRes res1 = ::pthread_cond_broadcast(&_cond);
255*f6dc9357SAndroid Build Coastguard Worker const WRes res2 = ::pthread_mutex_unlock(&_mutex);
256*f6dc9357SAndroid Build Coastguard Worker return (res2 ? res2 : res1);
257*f6dc9357SAndroid Build Coastguard Worker }
258*f6dc9357SAndroid Build Coastguard Worker };
259*f6dc9357SAndroid Build Coastguard Worker
260*f6dc9357SAndroid Build Coastguard Worker
261*f6dc9357SAndroid Build Coastguard Worker struct CBaseHandle_WFMO;
262*f6dc9357SAndroid Build Coastguard Worker typedef NWindows::NSynchronization::CBaseHandle_WFMO *CHandle_WFMO;
263*f6dc9357SAndroid Build Coastguard Worker
264*f6dc9357SAndroid Build Coastguard Worker // these constants are from Windows
265*f6dc9357SAndroid Build Coastguard Worker #define WAIT_OBJECT_0 0
266*f6dc9357SAndroid Build Coastguard Worker #define WAIT_FAILED ((DWORD)0xFFFFFFFF)
267*f6dc9357SAndroid Build Coastguard Worker
268*f6dc9357SAndroid Build Coastguard Worker DWORD WINAPI WaitForMultiObj_Any_Infinite(DWORD count, const CHandle_WFMO *handles);
269*f6dc9357SAndroid Build Coastguard Worker
270*f6dc9357SAndroid Build Coastguard Worker
271*f6dc9357SAndroid Build Coastguard Worker struct CBaseHandle_WFMO MY_UNCOPYABLE
272*f6dc9357SAndroid Build Coastguard Worker {
273*f6dc9357SAndroid Build Coastguard Worker CSynchro *_sync;
274*f6dc9357SAndroid Build Coastguard Worker
CBaseHandle_WFMOMY_UNCOPYABLE275*f6dc9357SAndroid Build Coastguard Worker CBaseHandle_WFMO(): _sync(NULL) {}
276*f6dc9357SAndroid Build Coastguard Worker virtual ~CBaseHandle_WFMO();
277*f6dc9357SAndroid Build Coastguard Worker
CHandle_WFMOMY_UNCOPYABLE278*f6dc9357SAndroid Build Coastguard Worker operator CHandle_WFMO() { return this; }
279*f6dc9357SAndroid Build Coastguard Worker virtual bool IsSignaledAndUpdate() = 0;
280*f6dc9357SAndroid Build Coastguard Worker };
281*f6dc9357SAndroid Build Coastguard Worker
282*f6dc9357SAndroid Build Coastguard Worker
283*f6dc9357SAndroid Build Coastguard Worker class CBaseEvent_WFMO : public CBaseHandle_WFMO
284*f6dc9357SAndroid Build Coastguard Worker {
285*f6dc9357SAndroid Build Coastguard Worker bool _manual_reset;
286*f6dc9357SAndroid Build Coastguard Worker bool _state;
287*f6dc9357SAndroid Build Coastguard Worker
288*f6dc9357SAndroid Build Coastguard Worker public:
289*f6dc9357SAndroid Build Coastguard Worker
290*f6dc9357SAndroid Build Coastguard Worker // bool IsCreated() { return (this->_sync != NULL); }
291*f6dc9357SAndroid Build Coastguard Worker // CBaseEvent_WFMO() { ; }
292*f6dc9357SAndroid Build Coastguard Worker // ~CBaseEvent_WFMO() Z7_override { Close(); }
293*f6dc9357SAndroid Build Coastguard Worker
Close()294*f6dc9357SAndroid Build Coastguard Worker WRes Close() { this->_sync = NULL; return 0; }
295*f6dc9357SAndroid Build Coastguard Worker
Create(CSynchro * sync,bool manualReset,bool initiallyOwn)296*f6dc9357SAndroid Build Coastguard Worker WRes Create(
297*f6dc9357SAndroid Build Coastguard Worker CSynchro *sync,
298*f6dc9357SAndroid Build Coastguard Worker bool manualReset, bool initiallyOwn)
299*f6dc9357SAndroid Build Coastguard Worker {
300*f6dc9357SAndroid Build Coastguard Worker this->_sync = sync;
301*f6dc9357SAndroid Build Coastguard Worker this->_manual_reset = manualReset;
302*f6dc9357SAndroid Build Coastguard Worker this->_state = initiallyOwn;
303*f6dc9357SAndroid Build Coastguard Worker return 0;
304*f6dc9357SAndroid Build Coastguard Worker }
305*f6dc9357SAndroid Build Coastguard Worker
Set()306*f6dc9357SAndroid Build Coastguard Worker WRes Set()
307*f6dc9357SAndroid Build Coastguard Worker {
308*f6dc9357SAndroid Build Coastguard Worker RINOK(this->_sync->Enter())
309*f6dc9357SAndroid Build Coastguard Worker this->_state = true;
310*f6dc9357SAndroid Build Coastguard Worker return this->_sync->LeaveAndSignal();
311*f6dc9357SAndroid Build Coastguard Worker }
312*f6dc9357SAndroid Build Coastguard Worker
Reset()313*f6dc9357SAndroid Build Coastguard Worker WRes Reset()
314*f6dc9357SAndroid Build Coastguard Worker {
315*f6dc9357SAndroid Build Coastguard Worker RINOK(this->_sync->Enter())
316*f6dc9357SAndroid Build Coastguard Worker this->_state = false;
317*f6dc9357SAndroid Build Coastguard Worker return this->_sync->Leave();
318*f6dc9357SAndroid Build Coastguard Worker }
319*f6dc9357SAndroid Build Coastguard Worker
320*f6dc9357SAndroid Build Coastguard Worker virtual bool IsSignaledAndUpdate() Z7_override;
321*f6dc9357SAndroid Build Coastguard Worker };
322*f6dc9357SAndroid Build Coastguard Worker
323*f6dc9357SAndroid Build Coastguard Worker
324*f6dc9357SAndroid Build Coastguard Worker class CManualResetEvent_WFMO Z7_final: public CBaseEvent_WFMO
325*f6dc9357SAndroid Build Coastguard Worker {
326*f6dc9357SAndroid Build Coastguard Worker public:
327*f6dc9357SAndroid Build Coastguard Worker WRes Create(CSynchro *sync, bool initiallyOwn = false) { return CBaseEvent_WFMO::Create(sync, true, initiallyOwn); }
328*f6dc9357SAndroid Build Coastguard Worker };
329*f6dc9357SAndroid Build Coastguard Worker
330*f6dc9357SAndroid Build Coastguard Worker
331*f6dc9357SAndroid Build Coastguard Worker class CAutoResetEvent_WFMO Z7_final: public CBaseEvent_WFMO
332*f6dc9357SAndroid Build Coastguard Worker {
333*f6dc9357SAndroid Build Coastguard Worker public:
Create(CSynchro * sync)334*f6dc9357SAndroid Build Coastguard Worker WRes Create(CSynchro *sync) { return CBaseEvent_WFMO::Create(sync, false, false); }
CreateIfNotCreated_Reset(CSynchro * sync)335*f6dc9357SAndroid Build Coastguard Worker WRes CreateIfNotCreated_Reset(CSynchro *sync)
336*f6dc9357SAndroid Build Coastguard Worker {
337*f6dc9357SAndroid Build Coastguard Worker return Create(sync);
338*f6dc9357SAndroid Build Coastguard Worker }
339*f6dc9357SAndroid Build Coastguard Worker };
340*f6dc9357SAndroid Build Coastguard Worker
341*f6dc9357SAndroid Build Coastguard Worker
342*f6dc9357SAndroid Build Coastguard Worker class CSemaphore_WFMO Z7_final: public CBaseHandle_WFMO
343*f6dc9357SAndroid Build Coastguard Worker {
344*f6dc9357SAndroid Build Coastguard Worker UInt32 _count;
345*f6dc9357SAndroid Build Coastguard Worker UInt32 _maxCount;
346*f6dc9357SAndroid Build Coastguard Worker
347*f6dc9357SAndroid Build Coastguard Worker public:
CSemaphore_WFMO()348*f6dc9357SAndroid Build Coastguard Worker CSemaphore_WFMO() : _count(0), _maxCount(0) {}
349*f6dc9357SAndroid Build Coastguard Worker
Close()350*f6dc9357SAndroid Build Coastguard Worker WRes Close() { this->_sync = NULL; return 0; }
351*f6dc9357SAndroid Build Coastguard Worker
Create(CSynchro * sync,UInt32 initCount,UInt32 maxCount)352*f6dc9357SAndroid Build Coastguard Worker WRes Create(CSynchro *sync, UInt32 initCount, UInt32 maxCount)
353*f6dc9357SAndroid Build Coastguard Worker {
354*f6dc9357SAndroid Build Coastguard Worker if (initCount > maxCount || maxCount < 1)
355*f6dc9357SAndroid Build Coastguard Worker return EINVAL;
356*f6dc9357SAndroid Build Coastguard Worker this->_sync = sync;
357*f6dc9357SAndroid Build Coastguard Worker this->_count = initCount;
358*f6dc9357SAndroid Build Coastguard Worker this->_maxCount = maxCount;
359*f6dc9357SAndroid Build Coastguard Worker return 0;
360*f6dc9357SAndroid Build Coastguard Worker }
361*f6dc9357SAndroid Build Coastguard Worker
362*f6dc9357SAndroid Build Coastguard Worker WRes Release(UInt32 releaseCount = 1)
363*f6dc9357SAndroid Build Coastguard Worker {
364*f6dc9357SAndroid Build Coastguard Worker if (releaseCount < 1)
365*f6dc9357SAndroid Build Coastguard Worker return EINVAL;
366*f6dc9357SAndroid Build Coastguard Worker
367*f6dc9357SAndroid Build Coastguard Worker RINOK(this->_sync->Enter())
368*f6dc9357SAndroid Build Coastguard Worker UInt32 newCount = this->_count + releaseCount;
369*f6dc9357SAndroid Build Coastguard Worker if (newCount > this->_maxCount)
370*f6dc9357SAndroid Build Coastguard Worker {
371*f6dc9357SAndroid Build Coastguard Worker RINOK(this->_sync->Leave())
372*f6dc9357SAndroid Build Coastguard Worker return ERROR_TOO_MANY_POSTS; // EINVAL
373*f6dc9357SAndroid Build Coastguard Worker }
374*f6dc9357SAndroid Build Coastguard Worker this->_count = newCount;
375*f6dc9357SAndroid Build Coastguard Worker
376*f6dc9357SAndroid Build Coastguard Worker return this->_sync->LeaveAndSignal();
377*f6dc9357SAndroid Build Coastguard Worker }
378*f6dc9357SAndroid Build Coastguard Worker
379*f6dc9357SAndroid Build Coastguard Worker virtual bool IsSignaledAndUpdate() Z7_override;
380*f6dc9357SAndroid Build Coastguard Worker };
381*f6dc9357SAndroid Build Coastguard Worker
382*f6dc9357SAndroid Build Coastguard Worker #endif // _WIN32
383*f6dc9357SAndroid Build Coastguard Worker
384*f6dc9357SAndroid Build Coastguard Worker }}
385*f6dc9357SAndroid Build Coastguard Worker
386*f6dc9357SAndroid Build Coastguard Worker #endif
387