From 26a734a5389c4605ecf11483349c14e796423f8f Mon Sep 17 00:00:00 2001 From: Aleric Inglewood Date: Sat, 10 Nov 2012 02:33:48 +0100 Subject: [PATCH] Add fasttimers around obtaining a mutex or waiting on a condition. --- indra/llcommon/llapr.cpp | 35 ++++++++++++++++++++++++----------- indra/llcommon/llthread.cpp | 27 +++++++++++++++++++++++++-- 2 files changed, 49 insertions(+), 13 deletions(-) diff --git a/indra/llcommon/llapr.cpp b/indra/llcommon/llapr.cpp index d16b87cd7..997da6a79 100644 --- a/indra/llcommon/llapr.cpp +++ b/indra/llcommon/llapr.cpp @@ -36,26 +36,39 @@ #include "llapr.h" #include "llscopedvolatileaprpool.h" +LLFastTimer::DeclareTimer FT_WAIT_FOR_SCOPEDLOCK("LLScopedLock"); + //--------------------------------------------------------------------- // // LLScopedLock // LLScopedLock::LLScopedLock(apr_thread_mutex_t* mutex) : mMutex(mutex) { - if(mutex) + mLocked = !!mutex; + if (LL_LIKELY(mutex)) { - if(ll_apr_warn_status(apr_thread_mutex_lock(mMutex))) + apr_status_t status = apr_thread_mutex_trylock(mMutex); + while (LL_UNLIKELY(status != APR_SUCCESS)) { - mLocked = false; + if (APR_STATUS_IS_EBUSY(status)) + { + if (AIThreadID::in_main_thread_inline()) + { + LLFastTimer ft1(FT_WAIT_FOR_SCOPEDLOCK); + status = apr_thread_mutex_lock(mMutex); + } + else + { + status = apr_thread_mutex_lock(mMutex); + } + } + else + { + ll_apr_warn_status(status); + mLocked = false; + return; + } } - else - { - mLocked = true; - } - } - else - { - mLocked = false; } } diff --git a/indra/llcommon/llthread.cpp b/indra/llcommon/llthread.cpp index 421ad4513..ac97d37de 100644 --- a/indra/llcommon/llthread.cpp +++ b/indra/llcommon/llthread.cpp @@ -382,9 +382,19 @@ LLCondition::~LLCondition() mAPRCondp = NULL; } +LLFastTimer::DeclareTimer FT_WAIT_FOR_CONDITION("LLCondition::wait()"); + void LLCondition::wait() { - apr_thread_cond_wait(mAPRCondp, mAPRMutexp); + if (AIThreadID::in_main_thread_inline()) + { + LLFastTimer ft1(FT_WAIT_FOR_CONDITION); + apr_thread_cond_wait(mAPRCondp, mAPRMutexp); + } + else + { + apr_thread_cond_wait(mAPRCondp, mAPRMutexp); + } } void LLCondition::signal() @@ -409,6 +419,8 @@ bool LLMutexBase::isSelfLocked() const return mLockingThread.equals_current_thread_inline(); } +LLFastTimer::DeclareTimer FT_WAIT_FOR_MUTEX("LLMutexBase::lock()"); + void LLMutexBase::lock() { if (mLockingThread.equals_current_thread_inline()) @@ -417,7 +429,18 @@ void LLMutexBase::lock() return; } - apr_thread_mutex_lock(mAPRMutexp); + if (APR_STATUS_IS_EBUSY(apr_thread_mutex_trylock(mAPRMutexp))) + { + if (AIThreadID::in_main_thread_inline()) + { + LLFastTimer ft1(FT_WAIT_FOR_MUTEX); + apr_thread_mutex_lock(mAPRMutexp); + } + else + { + apr_thread_mutex_lock(mAPRMutexp); + } + } mLockingThread.reset_inline(); }