Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/kornelski/7z.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'CPP/Windows/Synchronization.h')
-rwxr-xr-xCPP/Windows/Synchronization.h151
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