You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
155 lines
3.1 KiB
155 lines
3.1 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
|
|
#include <windows.h> |
|
#include "threadhelpers.h" |
|
#include "tier0/dbg.h" |
|
|
|
|
|
// -------------------------------------------------------------------------------- // |
|
// CCriticalSection implementation. |
|
// -------------------------------------------------------------------------------- // |
|
|
|
CCriticalSection::CCriticalSection() |
|
{ |
|
Assert( sizeof( CRITICAL_SECTION ) == SIZEOF_CS ); |
|
|
|
#if defined( _DEBUG ) |
|
InitializeCriticalSection( (CRITICAL_SECTION*)&m_DeadlockProtect ); |
|
#endif |
|
|
|
InitializeCriticalSection( (CRITICAL_SECTION*)&m_CS ); |
|
} |
|
|
|
|
|
CCriticalSection::~CCriticalSection() |
|
{ |
|
DeleteCriticalSection( (CRITICAL_SECTION*)&m_CS ); |
|
|
|
#if defined( _DEBUG ) |
|
DeleteCriticalSection( (CRITICAL_SECTION*)&m_DeadlockProtect ); |
|
#endif |
|
} |
|
|
|
|
|
|
|
void CCriticalSection::Lock() |
|
{ |
|
#if defined( _DEBUG ) |
|
// Check if this one is already locked. |
|
DWORD id = GetCurrentThreadId(); |
|
EnterCriticalSection( (CRITICAL_SECTION*)&m_DeadlockProtect ); |
|
Assert( m_Locks.Find( id ) == m_Locks.InvalidIndex() ); |
|
m_Locks.AddToTail( id ); |
|
LeaveCriticalSection( (CRITICAL_SECTION*)&m_DeadlockProtect ); |
|
#endif |
|
|
|
EnterCriticalSection( (CRITICAL_SECTION*)&m_CS ); |
|
} |
|
|
|
|
|
void CCriticalSection::Unlock() |
|
{ |
|
#if defined( _DEBUG ) |
|
// Check if this one is already locked. |
|
DWORD id = GetCurrentThreadId(); |
|
EnterCriticalSection( (CRITICAL_SECTION*)&m_DeadlockProtect ); |
|
int index = m_Locks.Find( id ); |
|
Assert( index != m_Locks.InvalidIndex() ); |
|
m_Locks.Remove( index ); |
|
LeaveCriticalSection( (CRITICAL_SECTION*)&m_DeadlockProtect ); |
|
#endif |
|
|
|
LeaveCriticalSection( (CRITICAL_SECTION*)&m_CS ); |
|
} |
|
|
|
|
|
|
|
// -------------------------------------------------------------------------------- // |
|
// CCriticalSectionLock implementation. |
|
// -------------------------------------------------------------------------------- // |
|
|
|
CCriticalSectionLock::CCriticalSectionLock( CCriticalSection *pCS ) |
|
{ |
|
m_pCS = pCS; |
|
m_bLocked = false; |
|
} |
|
|
|
|
|
CCriticalSectionLock::~CCriticalSectionLock() |
|
{ |
|
if ( m_bLocked ) |
|
m_pCS->Unlock(); |
|
} |
|
|
|
|
|
void CCriticalSectionLock::Lock() |
|
{ |
|
Assert( !m_bLocked ); |
|
m_bLocked = true; |
|
m_pCS->Lock(); |
|
} |
|
|
|
|
|
void CCriticalSectionLock::Unlock() |
|
{ |
|
Assert( m_bLocked ); |
|
m_bLocked = false; |
|
m_pCS->Unlock(); |
|
} |
|
|
|
|
|
// -------------------------------------------------------------------------------- // |
|
// CEvent implementation. |
|
// -------------------------------------------------------------------------------- // |
|
|
|
CEvent::CEvent() |
|
{ |
|
m_hEvent = NULL; |
|
} |
|
|
|
CEvent::~CEvent() |
|
{ |
|
Term(); |
|
} |
|
|
|
bool CEvent::Init( bool bManualReset, bool bInitialState ) |
|
{ |
|
Term(); |
|
|
|
m_hEvent = (void*)CreateEvent( NULL, bManualReset, bInitialState, NULL ); |
|
return (m_hEvent != NULL); |
|
} |
|
|
|
void CEvent::Term() |
|
{ |
|
if ( m_hEvent ) |
|
{ |
|
CloseHandle( (HANDLE)m_hEvent ); |
|
m_hEvent = NULL; |
|
} |
|
} |
|
|
|
void* CEvent::GetEventHandle() const |
|
{ |
|
Assert( m_hEvent ); |
|
return m_hEvent; |
|
} |
|
|
|
bool CEvent::SetEvent() |
|
{ |
|
Assert( m_hEvent ); |
|
return ::SetEvent( (HANDLE)m_hEvent ) != 0; |
|
} |
|
|
|
bool CEvent::ResetEvent() |
|
{ |
|
Assert( m_hEvent ); |
|
return ::ResetEvent( (HANDLE)m_hEvent ) != 0; |
|
} |
|
|
|
|
|
|