164 lines
2.5 KiB
C++
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
|