diff --git a/indra/llcommon/llmutex.h b/indra/llcommon/llmutex.h index 4eab97e920bd87b9b1ab8c0230e853cf8216d78f..099bb083701d5253a3daf21221043185bde6033e 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: