aboutsummaryrefslogtreecommitdiff
path: root/src/sync.h
diff options
context:
space:
mode:
authorAlexander Kjeldaas <alexander.kjeldaas@gmail.com>2012-11-11 03:11:13 -0300
committerAlexander Kjeldaas <alexander.kjeldaas@gmail.com>2012-11-14 00:00:23 -0300
commitbfc96207998c284e2cb6eb99c99b755a161e723d (patch)
tree205ae4cdb170e1fbb30a8891dbac4d5db622d499 /src/sync.h
parent6ca2ea2fa2465c80f60830241d53cbd278870288 (diff)
downloadbitcoin-bfc96207998c284e2cb6eb99c99b755a161e723d.tar.xz
Simplify CMutexLock
o Remove unused Leave and GetLock functions o Make Enter and TryEnter private. o Simplify Enter and TryEnter. boost::unique_lock doesn't really know whether the mutex it wraps is locked or not when the defer_lock option is used. The boost::recursive_mutex does not expose this information, so unique_lock only infers this knowledge. When taking the lock is defered, it (randomly) assumes that the lock is not taken. boost::unique_lock has the following definition: unique_lock(Mutex& m_,defer_lock_t): m(&m_),is_locked(false) {} bool owns_lock() const { return is_locked; } Thus it is a mistake to check owns_lock() in Enter and TryEnter - they will always return false.
Diffstat (limited to 'src/sync.h')
-rw-r--r--src/sync.h40
1 files changed, 10 insertions, 30 deletions
diff --git a/src/sync.h b/src/sync.h
index e80efbe001..9dfc6697c6 100644
--- a/src/sync.h
+++ b/src/sync.h
@@ -37,46 +37,31 @@ class CMutexLock
{
private:
boost::unique_lock<Mutex> lock;
-public:
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
- if (!lock.try_lock())
- {
- PrintLockContention(pszName, pszFile, nLine);
+ if (!lock.try_lock())
+ {
+ PrintLockContention(pszName, pszFile, nLine);
#endif
- lock.lock();
+ lock.lock();
#ifdef DEBUG_LOCKCONTENTION
- }
-#endif
- }
- }
-
- void Leave()
- {
- if (lock.owns_lock())
- {
- lock.unlock();
- LeaveCritical();
}
+#endif
}
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())
- {
- EnterCritical(pszName, pszFile, nLine, (void*)(lock.mutex()), true);
- lock.try_lock();
- if (!lock.owns_lock())
- LeaveCritical();
- }
+ LeaveCritical();
return lock.owns_lock();
}
+public:
CMutexLock(Mutex& mutexIn, const char* pszName, const char* pszFile, int nLine, bool fTry = false) : lock(mutexIn, boost::defer_lock)
{
if (fTry)
@@ -95,11 +80,6 @@ public:
{
return lock.owns_lock();
}
-
- boost::unique_lock<Mutex> &GetLock()
- {
- return lock;
- }
};
typedef CMutexLock<CCriticalSection> CCriticalBlock;