mirror of
https://github.com/Xevion/easy7zip.git
synced 2025-12-10 14:07:11 -06:00
115 lines
3.0 KiB
C++
Executable File
115 lines
3.0 KiB
C++
Executable File
// Windows/Synchronization.h
|
|
|
|
#ifndef __WINDOWS_SYNCHRONIZATION_H
|
|
#define __WINDOWS_SYNCHRONIZATION_H
|
|
|
|
#include "Defs.h"
|
|
#include "Handle.h"
|
|
|
|
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
|
|
{
|
|
public:
|
|
bool Create(bool manualReset, bool initiallyOwn, LPCTSTR name = NULL,
|
|
LPSECURITY_ATTRIBUTES securityAttributes = NULL)
|
|
{
|
|
_handle = ::CreateEvent(securityAttributes, BoolToBOOL(manualReset),
|
|
BoolToBOOL(initiallyOwn), name);
|
|
return (_handle != 0);
|
|
}
|
|
|
|
bool Open(DWORD desiredAccess, bool inheritHandle, LPCTSTR name)
|
|
{
|
|
_handle = ::OpenEvent(desiredAccess, BoolToBOOL(inheritHandle), name);
|
|
return (_handle != 0);
|
|
}
|
|
|
|
bool Set() { return BOOLToBool(::SetEvent(_handle)); }
|
|
bool Pulse() { return BOOLToBool(::PulseEvent(_handle)); }
|
|
bool Reset() { return BOOLToBool(::ResetEvent(_handle)); }
|
|
};
|
|
|
|
class CEvent: public CBaseEvent
|
|
{
|
|
public:
|
|
CEvent() {};
|
|
CEvent(bool manualReset, bool initiallyOwn,
|
|
LPCTSTR name = NULL, LPSECURITY_ATTRIBUTES securityAttributes = NULL);
|
|
};
|
|
|
|
class CManualResetEvent: public CEvent
|
|
{
|
|
public:
|
|
CManualResetEvent(bool initiallyOwn = false, LPCTSTR name = NULL,
|
|
LPSECURITY_ATTRIBUTES securityAttributes = NULL):
|
|
CEvent(true, initiallyOwn, name, securityAttributes) {};
|
|
};
|
|
|
|
class CAutoResetEvent: public CEvent
|
|
{
|
|
public:
|
|
CAutoResetEvent(bool initiallyOwn = false, LPCTSTR name = NULL,
|
|
LPSECURITY_ATTRIBUTES securityAttributes = NULL):
|
|
CEvent(false, initiallyOwn, name, securityAttributes) {};
|
|
};
|
|
|
|
class CMutex: public CObject
|
|
{
|
|
public:
|
|
bool Create(bool initiallyOwn, LPCTSTR name = NULL,
|
|
LPSECURITY_ATTRIBUTES securityAttributes = NULL)
|
|
{
|
|
_handle = ::CreateMutex(securityAttributes, BoolToBOOL(initiallyOwn), name);
|
|
return (_handle != 0);
|
|
}
|
|
bool Open(DWORD desiredAccess, bool inheritHandle, LPCTSTR name)
|
|
{
|
|
_handle = ::OpenMutex(desiredAccess, BoolToBOOL(inheritHandle), name);
|
|
return (_handle != 0);
|
|
}
|
|
bool Release() { return BOOLToBool(::ReleaseMutex(_handle)); }
|
|
};
|
|
|
|
class CMutexLock
|
|
{
|
|
CMutex &_object;
|
|
public:
|
|
CMutexLock(CMutex &object): _object(object) { _object.Lock(); }
|
|
~CMutexLock() { _object.Release(); }
|
|
};
|
|
|
|
class CCriticalSection
|
|
{
|
|
CRITICAL_SECTION _object;
|
|
// void Initialize() { ::InitializeCriticalSection(&_object); }
|
|
// void Delete() { ::DeleteCriticalSection(&_object); }
|
|
public:
|
|
CCriticalSection() { ::InitializeCriticalSection(&_object); }
|
|
~CCriticalSection() { ::DeleteCriticalSection(&_object); }
|
|
void Enter() { ::EnterCriticalSection(&_object); }
|
|
void Leave() { ::LeaveCriticalSection(&_object); }
|
|
};
|
|
|
|
class CCriticalSectionLock
|
|
{
|
|
CCriticalSection &_object;
|
|
void Unlock() { _object.Leave(); }
|
|
public:
|
|
CCriticalSectionLock(CCriticalSection &object): _object(object)
|
|
{_object.Enter(); }
|
|
~CCriticalSectionLock() { Unlock(); }
|
|
};
|
|
|
|
}}
|
|
|
|
#endif
|