xref: /aosp_15_r20/external/lzma/CPP/Windows/Synchronization.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
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