reactos/sdk/lib/atl/atlsync.h
Katayama Hirofumi MZ dd5a634611
[ATL] Add atlsync.h (#4382)
- Add atlsync.h and implement CCriticalSection, CEvent, CMutex and CSemaphore classes.
CORE-13950
2022-03-07 11:02:42 +09:00

201 lines
4.3 KiB
C++

/*
* PROJECT: ReactOS ATL
* LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
* PURPOSE: ATL Synchronization
* COPYRIGHT: Copyright 2022 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
*/
#pragma once
#ifndef __ATLSYNC_H__
#define __ATLSYNC_H__
#include "atlbase.h"
namespace ATL
{
class CCriticalSection : public CRITICAL_SECTION
{
CCriticalSection()
{
::InitializeCriticalSection(this);
}
~CCriticalSection()
{
::DeleteCriticalSection(this);
}
void Enter()
{
::EnterCriticalSection(this);
}
void Leave()
{
::LeaveCriticalSection(this);
}
BOOL TryEnter()
{
return ::TryEnterCriticalSection(this);
}
};
class CEvent : public CHandle
{
CEvent()
{
}
CEvent(CEvent& hEvent) : CHandle(hEvent)
{
}
CEvent(BOOL bManualReset, BOOL bInitialState)
{
Create(NULL, bManualReset, bInitialState, NULL);
}
CEvent(LPSECURITY_ATTRIBUTES pSecurity, BOOL bManualReset, BOOL bInitialState, LPCTSTR pszName)
{
Create(pSecurity, bManualReset, bInitialState, pszName);
}
explicit CEvent(HANDLE hEvent) : CHandle(hEvent)
{
}
BOOL Create(LPSECURITY_ATTRIBUTES pSecurity, BOOL bManualReset, BOOL bInitialState, LPCTSTR pszName)
{
HANDLE hEvent = ::CreateEvent(pSecurity, bManualReset, bInitialState, pszName);
ATLASSERT(hEvent != NULL);
Attach(hEvent);
return hEvent != NULL;
}
BOOL Open(DWORD dwAccess, BOOL bInheritHandle, LPCTSTR pszName)
{
HANDLE hEvent = ::OpenEvent(dwAccess, bInheritHandle, pszName);
ATLASSERT(hEvent != NULL);
Attach(hEvent);
return hEvent != NULL;
}
BOOL Set()
{
ATLASSERT(*this);
return ::SetEvent(*this);
}
BOOL Reset()
{
ATLASSERT(*this);
return ::ResetEvent(*this);
}
BOOL Pulse()
{
ATLASSERT(*this);
return ::PulseEvent(*this);
}
};
class CMutex : public CHandle
{
CMutex()
{
}
CMutex(CMutex& hMutex) : CHandle(hMutex)
{
}
explicit CMutex(BOOL bInitialOwner)
{
Create(NULL, bInitialOwner, NULL);
}
CMutex(LPSECURITY_ATTRIBUTES pSecurity, BOOL bInitialOwner, LPCTSTR pszName)
{
Create(pSecurity, bInitialOwner, pszName);
}
explicit CMutex(HANDLE hMutex) : CHandle(hMutex)
{
}
BOOL Create(LPSECURITY_ATTRIBUTES pSecurity, BOOL bInitialOwner, LPCTSTR pszName)
{
HANDLE hMutex = ::CreateMutex(pSecurity, bInitialOwner, pszName);
ATLASSERT(hMutex != NULL);
Attach(hMutex);
return hMutex != NULL;
}
BOOL Open(DWORD dwAccess, BOOL bInheritHandle, LPCTSTR pszName)
{
HANDLE hMutex = ::OpenMutex(dwAccess, bInheritHandle, pszName);
ATLASSERT(hMutex != NULL);
Attach(hMutex);
return hMutex != NULL;
}
BOOL Release()
{
ATLASSERT(*this);
return ::ReleaseMutex(*this);
}
};
class CSemaphore : public CHandle
{
CSemaphore()
{
}
CSemaphore(CSemaphore& hSemaphore) : CHandle(hSemaphore)
{
}
CSemaphore(LONG nInitialCount, LONG nMaxCount)
{
Create(NULL, nInitialCount, nMaxCount, NULL);
}
CSemaphore(LPSECURITY_ATTRIBUTES pSecurity, LONG nInitialCount, LONG nMaxCount, LPCTSTR pszName)
{
Create(pSecurity, nInitialCount, nMaxCount, pszName);
}
explicit CSemaphore(HANDLE hSemaphore) : CHandle(hSemaphore)
{
}
BOOL Create(LPSECURITY_ATTRIBUTES pSecurity, LONG nInitialCount, LONG nMaxCount, LPCTSTR pszName)
{
HANDLE hSemaphore = ::CreateSemaphore(pSecurity, nInitialCount, nMaxCount, pszName);
ATLASSERT(hSemaphore != NULL);
Attach(hSemaphore);
return hSemaphore != NULL;
}
BOOL Open(DWORD dwAccess, BOOL bInheritHandle, LPCTSTR pszName)
{
HANDLE hSemaphore = ::OpenSemaphore(dwAccess, bInheritHandle, pszName);
ATLASSERT(hSemaphore != NULL);
Attach(hSemaphore);
return hSemaphore != NULL;
}
BOOL Release(LONG nReleaseCount = 1, LPLONG pnOldCount = NULL)
{
ATLASSERT(*this);
return ::ReleaseSemaphore(*this, nReleaseCount, pnOldCount);
}
};
} // namespace ATL
#endif // __ATLSYNC_H__