|
|
@ -37,46 +37,31 @@ class CMutexLock |
|
|
|
{ |
|
|
|
{ |
|
|
|
private: |
|
|
|
private: |
|
|
|
boost::unique_lock<Mutex> lock; |
|
|
|
boost::unique_lock<Mutex> lock; |
|
|
|
public: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void Enter(const char* pszName, const char* pszFile, int nLine) |
|
|
|
void Enter(const char* pszName, const char* pszFile, int nLine) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (!lock.owns_lock()) |
|
|
|
EnterCritical(pszName, pszFile, nLine, (void*)(lock.mutex())); |
|
|
|
{ |
|
|
|
|
|
|
|
EnterCritical(pszName, pszFile, nLine, (void*)(lock.mutex())); |
|
|
|
|
|
|
|
#ifdef DEBUG_LOCKCONTENTION |
|
|
|
#ifdef DEBUG_LOCKCONTENTION |
|
|
|
if (!lock.try_lock()) |
|
|
|
if (!lock.try_lock()) |
|
|
|
{ |
|
|
|
{ |
|
|
|
PrintLockContention(pszName, pszFile, nLine); |
|
|
|
PrintLockContention(pszName, pszFile, nLine); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
lock.lock(); |
|
|
|
lock.lock(); |
|
|
|
#ifdef DEBUG_LOCKCONTENTION |
|
|
|
#ifdef DEBUG_LOCKCONTENTION |
|
|
|
} |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void Leave() |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if (lock.owns_lock()) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
lock.unlock(); |
|
|
|
|
|
|
|
LeaveCritical(); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
#endif |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool TryEnter(const char* pszName, const char* pszFile, int nLine) |
|
|
|
bool TryEnter(const char* pszName, const char* pszFile, int nLine) |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
EnterCritical(pszName, pszFile, nLine, (void*)(lock.mutex()), true); |
|
|
|
|
|
|
|
lock.try_lock(); |
|
|
|
if (!lock.owns_lock()) |
|
|
|
if (!lock.owns_lock()) |
|
|
|
{ |
|
|
|
LeaveCritical(); |
|
|
|
EnterCritical(pszName, pszFile, nLine, (void*)(lock.mutex()), true); |
|
|
|
|
|
|
|
lock.try_lock(); |
|
|
|
|
|
|
|
if (!lock.owns_lock()) |
|
|
|
|
|
|
|
LeaveCritical(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return lock.owns_lock(); |
|
|
|
return lock.owns_lock(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public: |
|
|
|
CMutexLock(Mutex& mutexIn, const char* pszName, const char* pszFile, int nLine, bool fTry = false) : lock(mutexIn, boost::defer_lock) |
|
|
|
CMutexLock(Mutex& mutexIn, const char* pszName, const char* pszFile, int nLine, bool fTry = false) : lock(mutexIn, boost::defer_lock) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (fTry) |
|
|
|
if (fTry) |
|
|
@ -95,11 +80,6 @@ public: |
|
|
|
{ |
|
|
|
{ |
|
|
|
return lock.owns_lock(); |
|
|
|
return lock.owns_lock(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
boost::unique_lock<Mutex> &GetLock() |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
return lock; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
typedef CMutexLock<CCriticalSection> CCriticalBlock; |
|
|
|
typedef CMutexLock<CCriticalSection> CCriticalBlock; |
|
|
|