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