Imported Upstream version 9.20
[platform/upstream/7zip.git] / CPP / Windows / Synchronization.h
1 // Windows/Synchronization.h\r
2 \r
3 #ifndef __WINDOWS_SYNCHRONIZATION_H\r
4 #define __WINDOWS_SYNCHRONIZATION_H\r
5 \r
6 #include "../../C/Threads.h"\r
7 \r
8 #include "Defs.h"\r
9 \r
10 #ifdef _WIN32\r
11 #include "Handle.h"\r
12 #endif\r
13 \r
14 namespace NWindows {\r
15 namespace NSynchronization {\r
16 \r
17 class CBaseEvent\r
18 {\r
19 protected:\r
20   ::CEvent _object;\r
21 public:\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
27   #ifdef _WIN32\r
28   WRes Create(bool manualReset, bool initiallyOwn, LPCTSTR name = NULL, LPSECURITY_ATTRIBUTES sa = NULL)\r
29   {\r
30     _object = ::CreateEvent(sa, BoolToBOOL(manualReset), BoolToBOOL(initiallyOwn), name);\r
31     if (name == NULL && _object != 0)\r
32       return 0;\r
33     return ::GetLastError();\r
34   }\r
35   WRes Open(DWORD desiredAccess, bool inheritHandle, LPCTSTR name)\r
36   {\r
37     _object = ::OpenEvent(desiredAccess, BoolToBOOL(inheritHandle), name);\r
38     if (_object != 0)\r
39       return 0;\r
40     return ::GetLastError();\r
41   }\r
42   #endif\r
43 \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
48 };\r
49 \r
50 class CManualResetEvent: public CBaseEvent\r
51 {\r
52 public:\r
53   WRes Create(bool initiallyOwn = false)\r
54   {\r
55     return ManualResetEvent_Create(&_object, initiallyOwn ? 1: 0);\r
56   }\r
57   WRes CreateIfNotCreated()\r
58   {\r
59     if (IsCreated())\r
60       return 0;\r
61     return ManualResetEvent_CreateNotSignaled(&_object);\r
62   }\r
63   #ifdef _WIN32\r
64   WRes CreateWithName(bool initiallyOwn, LPCTSTR name)\r
65   {\r
66     return CBaseEvent::Create(true, initiallyOwn, name);\r
67   }\r
68   #endif\r
69 };\r
70 \r
71 class CAutoResetEvent: public CBaseEvent\r
72 {\r
73 public:\r
74   WRes Create()\r
75   {\r
76     return AutoResetEvent_CreateNotSignaled(&_object);\r
77   }\r
78   WRes CreateIfNotCreated()\r
79   {\r
80     if (IsCreated())\r
81       return 0;\r
82     return AutoResetEvent_CreateNotSignaled(&_object);\r
83   }\r
84 };\r
85 \r
86 #ifdef _WIN32\r
87 class CObject: public CHandle\r
88 {\r
89 public:\r
90   WRes Lock(DWORD timeoutInterval = INFINITE)\r
91     { return (::WaitForSingleObject(_handle, timeoutInterval) == WAIT_OBJECT_0 ? 0 : ::GetLastError()); }\r
92 };\r
93 class CMutex: public CObject\r
94 {\r
95 public:\r
96   WRes Create(bool initiallyOwn, LPCTSTR name = NULL, LPSECURITY_ATTRIBUTES sa = NULL)\r
97   {\r
98     _handle = ::CreateMutex(sa, BoolToBOOL(initiallyOwn), name);\r
99     if (name == NULL && _handle != 0)\r
100       return 0;\r
101     return ::GetLastError();\r
102   }\r
103   #ifndef UNDER_CE\r
104   WRes Open(DWORD desiredAccess, bool inheritHandle, LPCTSTR name)\r
105   {\r
106     _handle = ::OpenMutex(desiredAccess, BoolToBOOL(inheritHandle), name);\r
107     if (_handle != 0)\r
108       return 0;\r
109     return ::GetLastError();\r
110   }\r
111   #endif\r
112   WRes Release()\r
113   {\r
114     return ::ReleaseMutex(_handle) ? 0 : ::GetLastError();\r
115   }\r
116 };\r
117 class CMutexLock\r
118 {\r
119   CMutex *_object;\r
120 public:\r
121   CMutexLock(CMutex &object): _object(&object) { _object->Lock(); }\r
122   ~CMutexLock() { _object->Release(); }\r
123 };\r
124 #endif\r
125 \r
126 class CSemaphore\r
127 {\r
128   ::CSemaphore _object;\r
129 public:\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
135   {\r
136     return Semaphore_Create(&_object, initiallyCount, maxCount);\r
137   }\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
141 };\r
142 \r
143 class CCriticalSection\r
144 {\r
145   ::CCriticalSection _object;\r
146 public:\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
151 };\r
152 \r
153 class CCriticalSectionLock\r
154 {\r
155   CCriticalSection *_object;\r
156   void Unlock()  { _object->Leave(); }\r
157 public:\r
158   CCriticalSectionLock(CCriticalSection &object): _object(&object) {_object->Enter(); }\r
159   ~CCriticalSectionLock() { Unlock(); }\r
160 };\r
161 \r
162 }}\r
163 \r
164 #endif\r