diff options
| author | Alexander Gavriliuk <alexandrgproductengine@lindenlab.com> | 2024-01-07 14:44:52 +0100 | 
|---|---|---|
| committer | Guru <alexandrgproductengine@lindenlab.com> | 2024-01-07 18:59:43 +0100 | 
| commit | e4a1feb83079965fbebd356aa694adf100fb7ee3 (patch) | |
| tree | e4f188cd36fe5afa0fd36971982bef7fe1388414 | |
| parent | f62b8591a29481ce882b1e50246f848475d3fb6a (diff) | |
SL-20743 Use LLMutex in LLImageBase for internal data thread-safety (update)
| -rw-r--r-- | indra/llcommon/llmutex.cpp | 13 | 
1 files changed, 11 insertions, 2 deletions
| diff --git a/indra/llcommon/llmutex.cpp b/indra/llcommon/llmutex.cpp index f56c2d08a6..973ecbc87b 100644 --- a/indra/llcommon/llmutex.cpp +++ b/indra/llcommon/llmutex.cpp @@ -196,9 +196,18 @@ void LLSharedMutex::lockExclusive()      LLThread::id_t current_thread = LLThread::currentID();      mLockMutex.lock(); -    if (mLockingThreads.size() == 1 && mLockingThreads.begin()->first == current_thread) +    iterator it = mLockingThreads.find(current_thread); +    if (it != mLockingThreads.end())      { -        mLockingThreads.begin()->second++; +        if (mIsShared) +        { +            // The mutex is already locked in the current thread +            // but this lock is SHARED (not EXCLISIVE) +            // We can't lock it again, the lock stays shared +            // This can lead to a collision (theoretically) +            llassert_always(!"The current thread is already locked SHARED and can't be locked EXCLUSIVE"); +        } +        it->second++;      }      else      { | 
