1
0
Fork 0
cuberite-2a/src/OSSupport/CriticalSection.cpp

144 lines
1.5 KiB
C++

#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules
#include "CriticalSection.h"
////////////////////////////////////////////////////////////////////////////////
// cCriticalSection:
cCriticalSection::cCriticalSection():
m_RecursionCount(0)
{
}
void cCriticalSection::Lock()
{
m_Mutex.lock();
m_RecursionCount += 1;
m_OwningThreadID = std::this_thread::get_id();
}
void cCriticalSection::Unlock()
{
ASSERT(IsLockedByCurrentThread());
m_RecursionCount -= 1;
m_Mutex.unlock();
}
bool cCriticalSection::IsLocked(void)
{
return (m_RecursionCount > 0);
}
bool cCriticalSection::IsLockedByCurrentThread(void)
{
return ((m_RecursionCount > 0) && (m_OwningThreadID == std::this_thread::get_id()));
}
////////////////////////////////////////////////////////////////////////////////
// cCSLock
cCSLock::cCSLock(cCriticalSection * a_CS)
: m_CS(a_CS)
, m_IsLocked(false)
{
Lock();
}
cCSLock::cCSLock(cCriticalSection & a_CS)
: m_CS(&a_CS)
, m_IsLocked(false)
{
Lock();
}
cCSLock::~cCSLock()
{
if (!m_IsLocked)
{
return;
}
Unlock();
}
void cCSLock::Lock(void)
{
ASSERT(!m_IsLocked);
m_IsLocked = true;
m_CS->Lock();
}
void cCSLock::Unlock(void)
{
ASSERT(m_IsLocked);
m_IsLocked = false;
m_CS->Unlock();
}
////////////////////////////////////////////////////////////////////////////////
// cCSUnlock:
cCSUnlock::cCSUnlock(cCSLock & a_Lock) :
m_Lock(a_Lock)
{
m_Lock.Unlock();
}
cCSUnlock::~cCSUnlock()
{
m_Lock.Lock();
}