From d2e15bf78b5d871ae19e36158bcfaf44761bf277 Mon Sep 17 00:00:00 2001 From: vng Date: Fri, 5 Jul 2013 15:39:03 +0300 Subject: [PATCH] Add TryLock function to Mutex and Condition. --- base/condition.hpp | 2 ++ base/condition_posix.cpp | 7 ++++++- base/condition_windows_native.cpp | 12 ++++++++++++ base/mutex.hpp | 15 +++++++++++++-- 4 files changed, 33 insertions(+), 3 deletions(-) diff --git a/base/condition.hpp b/base/condition.hpp index c4b00090c3..331aa9f4f8 100644 --- a/base/condition.hpp +++ b/base/condition.hpp @@ -23,7 +23,9 @@ namespace threads void Wait(); /// @return whether we are exiting by timeout. bool Wait(unsigned ms); + void Lock(); + bool TryLock(); void Unlock(); }; diff --git a/base/condition_posix.cpp b/base/condition_posix.cpp index be679649b4..339e52650e 100644 --- a/base/condition_posix.cpp +++ b/base/condition_posix.cpp @@ -23,7 +23,7 @@ namespace threads }; } - Condition::Condition() : m_pImpl(new impl::ConditionImpl) + Condition::Condition() : m_pImpl(new impl::ConditionImpl()) { ::pthread_cond_init(&m_pImpl->m_Condition, 0); } @@ -75,6 +75,11 @@ namespace threads m_pImpl->m_Mutex.Lock(); } + bool Condition::TryLock() + { + return m_pImpl->m_Mutex.TryLock(); + } + void Condition::Unlock() { m_pImpl->m_Mutex.Unlock(); diff --git a/base/condition_windows_native.cpp b/base/condition_windows_native.cpp index ec8f87396f..710989bdc7 100644 --- a/base/condition_windows_native.cpp +++ b/base/condition_windows_native.cpp @@ -69,6 +69,11 @@ namespace threads m_mutex.Lock(); } + bool TryLock() + { + return m_mutex.TryLock(); + } + void Unlock() { m_mutex.Unlock(); @@ -218,6 +223,13 @@ namespace threads ::WaitForSingleObject(m_mutex, INFINITE); } + bool TryLock() + { + /// @todo I don't care :) + Lock(); + return true; + } + void Unlock() { ::ReleaseMutex(m_mutex); diff --git a/base/mutex.hpp b/base/mutex.hpp index 25afb9d19b..95173b27fb 100644 --- a/base/mutex.hpp +++ b/base/mutex.hpp @@ -1,5 +1,7 @@ #pragma once +#include "assert.hpp" + #include "../std/target_os.hpp" #if defined(OMIM_OS_BADA) @@ -72,7 +74,16 @@ namespace threads #elif defined(OMIM_OS_WINDOWS_NATIVE) ::EnterCriticalSection(&m_Mutex); #else - ::pthread_mutex_lock(&m_Mutex); + VERIFY(0 == ::pthread_mutex_lock(&m_Mutex), ()); +#endif + } + + bool TryLock() + { +#if defined(OMIM_OS_WINDOWS_NATIVE) + return (TRUE == ::TryEnterCriticalSection(&m_Mutex)); +#else + return (0 == ::pthread_mutex_trylock(&m_Mutex)); #endif } @@ -83,7 +94,7 @@ namespace threads #elif defined(OMIM_OS_WINDOWS_NATIVE) ::LeaveCriticalSection(&m_Mutex); #else - ::pthread_mutex_unlock(&m_Mutex); + VERIFY(0 == ::pthread_mutex_unlock(&m_Mutex), ()); #endif }