summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRye Mutt <rye@lindenlab.com>2024-10-01 19:01:36 -0400
committerBrad Linden <brad@lindenlab.com>2024-10-01 16:06:33 -0700
commit74fe406916a21b0ac7cecaff9549ea5e374176c8 (patch)
tree9b216a76749703e7ef2c451b57c25731bb02c459
parentb4b52e471739e5aa8ba03985b124ae5da2bdedd7 (diff)
Fix thread-unsafe usage of LLPointer and LLMeshSkinInfo(#2755) (#2759)
-rw-r--r--indra/newview/llmeshrepository.cpp10
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));
}
}