diff options
author | Rye Mutt <rye@lindenlab.com> | 2024-10-01 19:01:36 -0400 |
---|---|---|
committer | Brad Linden <brad@lindenlab.com> | 2024-10-01 16:06:33 -0700 |
commit | 74fe406916a21b0ac7cecaff9549ea5e374176c8 (patch) | |
tree | 9b216a76749703e7ef2c451b57c25731bb02c459 | |
parent | b4b52e471739e5aa8ba03985b124ae5da2bdedd7 (diff) |
Fix thread-unsafe usage of LLPointer and LLMeshSkinInfo(#2755) (#2759)
-rw-r--r-- | indra/newview/llmeshrepository.cpp | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 1f214344ff..a5bed1dbe6 100644 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -864,7 +864,7 @@ LLMeshRepoThread::~LLMeshRepoThread() while (!mSkinInfoQ.empty()) { - delete mSkinInfoQ.front(); + llassert(mSkinInfoQ.front()->getNumRefs() == 1); mSkinInfoQ.pop_front(); } @@ -2058,13 +2058,15 @@ bool LLMeshRepoThread::skinInfoReceived(const LLUUID& mesh_id, U8* data, S32 dat LLSkinningUtil::initJointNums(info, gAgentAvatarp); } - // remember the skin info in the background thread so we can use it + // copy the skin info for the background thread so we can use it // to calculate per-joint bounding boxes when volumes are loaded - mSkinMap[mesh_id] = info; + mSkinMap[mesh_id] = new LLMeshSkinInfo(*info); { + // Move the LLPointer in to the skin info queue to avoid reference + // count modification after we leave the lock LLMutexLock lock(mMutex); - mSkinInfoQ.push_back(info); + mSkinInfoQ.emplace_back(std::move(info)); } } |