Files
mir_server/sdk/system/Lock.cpp
aixianling 5c9f1dae4a init
2025-01-09 17:45:40 +08:00

164 lines
2.5 KiB
C++

#include "_osdef.h"
#include "Lock.h"
using namespace wylib::sync::lock;
#ifdef WIN32
CCSLock::CCSLock()
{
InitializeCriticalSection( &m_CriticalSection );
m_pFileName =NULL;
m_nLine =0;
}
CCSLock::~CCSLock()
{
DeleteCriticalSection( &m_CriticalSection );
}
#else
#define recursive_mutex_flag PTHREAD_MUTEX_RECURSIVE_NP
//bool CCSLock::attr_initalized = false;
//pthread_mutexattr_t CCSLock::attr;
CCSLock::CCSLock()
{
/*
if(!attr_initalized)
{
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr, recursive_mutex_flag);
attr_initalized = true;
}
pthread_mutex_init(&mutex, &attr);
*/
pthread_mutex_init(&mutex,NULL);
}
CCSLock::~CCSLock() { pthread_mutex_destroy(&mutex); }
#endif
void CCSLock::_Lock( char *sFile,int nLine)
{
#ifndef WIN32
pthread_mutex_lock(&mutex);
#else
EnterCriticalSection(&m_CriticalSection);
#endif
m_pFileName =sFile;
m_nLine= nLine;
}
BOOL CCSLock::TryLock()
{
#ifndef WIN32
return (pthread_mutex_trylock(&mutex) == 0);
#else
return TryEnterCriticalSection(&m_CriticalSection);
#endif
}
void CCSLock::_Unlock( char *sFile,int nLine)
{
#ifndef WIN32
pthread_mutex_unlock(&mutex);
#else
LeaveCriticalSection(&m_CriticalSection);
#endif
m_pFileName =0;
m_nLine= 0;
}
//#ifdef WIN32
CAtomLock::CAtomLock()
{
m_uLockFlag = Unlocked;
m_dwLockThread = 0;
m_dwLockCount = 0;
}
CAtomLock::~CAtomLock()
{
}
void CAtomLock::_Lock( char *sFile,int nLine)
{
#ifdef WIN32
DWORD dwThreadId = GetCurrentThreadId();
#else
DWORD dwThreadId = pthread_self();
#endif
if ( dwThreadId == m_dwLockThread )
{
m_dwLockCount++;
}
else
{
while ( Unlocked != InterlockedCompareExchange( &m_uLockFlag, Locked, Unlocked ) )
{
OnLockWait();
}
m_dwLockThread = dwThreadId;
m_dwLockCount++;
}
m_pFileName =sFile;
m_nLine= nLine;
}
BOOL CAtomLock::TryLock()
{
#ifdef WIN32
DWORD dwThreadId = GetCurrentThreadId();
#else
DWORD dwThreadId = pthread_self();
#endif
if ( dwThreadId == m_dwLockThread )
{
m_dwLockCount++;
}
else
{
if ( Unlocked != InterlockedCompareExchange( &m_uLockFlag, Locked, Unlocked ) )
return false;
m_dwLockThread = dwThreadId;
m_dwLockCount++;
}
return true;
}
void CAtomLock::_Unlock( char *sFile,int nLine)
{
#ifdef WIN32
if ( GetCurrentThreadId() == m_dwLockThread )
#else
if ( pthread_self() == m_dwLockThread )
#endif
{
m_dwLockCount--;
if ( !m_dwLockCount )
{
m_uLockFlag = Unlocked;
m_dwLockThread = 0;
}
}
m_pFileName =0;
m_nLine= 0;
}
void CAtomLock::OnLockWait()
{
}
//#endif