|
|
|
#pragma once
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
// CritSec
|
|
|
|
// Description: Wraps a critical section.
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
class CritSec
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
CRITICAL_SECTION m_criticalSection;
|
|
|
|
public:
|
|
|
|
CritSec()
|
|
|
|
{
|
|
|
|
InitializeCriticalSectionEx(&m_criticalSection, 100, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
~CritSec()
|
|
|
|
{
|
|
|
|
DeleteCriticalSection(&m_criticalSection);
|
|
|
|
}
|
|
|
|
|
|
|
|
_Acquires_lock_(m_criticalSection)
|
|
|
|
void Lock()
|
|
|
|
{
|
|
|
|
EnterCriticalSection(&m_criticalSection);
|
|
|
|
}
|
|
|
|
|
|
|
|
_Releases_lock_(m_criticalSection)
|
|
|
|
void Unlock()
|
|
|
|
{
|
|
|
|
LeaveCriticalSection(&m_criticalSection);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
// AutoLock
|
|
|
|
// Description: Provides automatic locking and unlocking of a
|
|
|
|
// of a critical section.
|
|
|
|
//
|
|
|
|
// Note: The AutoLock object must go out of scope before the CritSec.
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
class AutoLock
|
|
|
|
{
|
|
|
|
private:
|
|
|
|
CritSec *m_pCriticalSection;
|
|
|
|
public:
|
|
|
|
_Acquires_lock_(m_pCriticalSection)
|
|
|
|
AutoLock(CritSec& crit)
|
|
|
|
{
|
|
|
|
m_pCriticalSection = &crit;
|
|
|
|
m_pCriticalSection->Lock();
|
|
|
|
}
|
|
|
|
|
|
|
|
_Releases_lock_(m_pCriticalSection)
|
|
|
|
~AutoLock()
|
|
|
|
{
|
|
|
|
m_pCriticalSection->Unlock();
|
|
|
|
}
|
|
|
|
};
|