From a2671c177a6579199052307da61b7df9e1166778 Mon Sep 17 00:00:00 2001 From: Rye Mutt <rye@alchemyviewer.org> Date: Thu, 10 Jun 2021 02:45:45 -0400 Subject: [PATCH] Add lock and unlock functions to LLMutexLock and LLMutexTryLock --- indra/llcommon/llmutex.h | 68 ++++++++++++++++++++++++++++++---------- 1 file changed, 51 insertions(+), 17 deletions(-) diff --git a/indra/llcommon/llmutex.h b/indra/llcommon/llmutex.h index 4eab97e920b..099bb083701 100644 --- a/indra/llcommon/llmutex.h +++ b/indra/llcommon/llmutex.h @@ -82,24 +82,37 @@ class LLMutexLock { public: LLMutexLock(LLMutex* mutex) + : mMutex(mutex) + , mLocked(false) { - mMutex = mutex; - - if(mMutex) - mMutex->lock(); + lock(); } + ~LLMutexLock() { unlock(); } + + void lock() + { + if (mMutex && !mLocked) + { + mMutex->lock(); + mLocked = true; + } + } + void unlock() { - if (mMutex) + if (mMutex && mLocked) + { mMutex->unlock(); - mMutex = nullptr; + mLocked = false; + } } private: LLMutex* mMutex; + bool mLocked; }; //============================================================================ @@ -127,27 +140,48 @@ class LLMutexTrylock : mMutex(mutex), mLocked(false) { - if (!mMutex) - return; + lock(aTries, delay_ms); + } - for (U32 i = 0; i < aTries; ++i) + ~LLMutexTrylock() + { + unlock(); + } + + bool isLocked() const + { + return mLocked; + } + + void lock() + { + if (mMutex && !mLocked) { mLocked = mMutex->trylock(); - if (mLocked) - break; - std::this_thread::sleep_for(std::chrono::milliseconds(delay_ms)); } } - ~LLMutexTrylock() + void lock(U32 aTries, U32 delay_ms) { - if (mMutex && mLocked) - mMutex->unlock(); + if (mMutex && !mLocked) + { + for (U32 i = 0; i < aTries; ++i) + { + mLocked = mMutex->trylock(); + if (mLocked) + break; + std::this_thread::sleep_for(std::chrono::milliseconds(delay_ms)); + } + } } - bool isLocked() const + void unlock() { - return mLocked; + if (mMutex && mLocked) + { + mMutex->unlock(); + mLocked = false; + } } private: -- GitLab