diff options
author | Brad Linden <brad@lindenlab.com> | 2023-04-17 10:24:23 -0700 |
---|---|---|
committer | Brad Linden <brad@lindenlab.com> | 2023-05-02 15:57:49 -0700 |
commit | 3513f67d2c5628eac2ce9aa632a8491bb215a9e8 (patch) | |
tree | 09ad363a35ee6a67229bce0c35899d6c33638e9e /indra/newview | |
parent | 2994833e7cc53670bd3303cb88054d7acee875cf (diff) |
Attempt at fixing thread safety possibly related to SL-19648
Diffstat (limited to 'indra/newview')
-rw-r--r-- | indra/newview/llgltfmateriallist.cpp | 30 |
1 files changed, 15 insertions, 15 deletions
diff --git a/indra/newview/llgltfmateriallist.cpp b/indra/newview/llgltfmateriallist.cpp index 151d7fa969..7d677626ce 100644 --- a/indra/newview/llgltfmateriallist.cpp +++ b/indra/newview/llgltfmateriallist.cpp @@ -219,7 +219,7 @@ public: struct ReturnData { public: - LLPointer<LLGLTFMaterial> mMaterial; + LLGLTFMaterial mMaterial; S32 mSide; bool mSuccess; }; @@ -239,20 +239,16 @@ public: std::unordered_map<S32, std::string>::const_iterator end = object_override.mSides.end(); while (iter != end) { - LLPointer<LLGLTFMaterial> override_data = new LLGLTFMaterial(); std::string warn_msg, error_msg; - bool success = override_data->fromJSON(iter->second, warn_msg, error_msg); - ReturnData result; + + bool success = result.mMaterial.fromJSON(iter->second, warn_msg, error_msg); + result.mSuccess = success; result.mSide = iter->first; - if (success) - { - result.mMaterial = override_data; - } - else + if (!success) { LL_WARNS("GLTF") << "failed to parse GLTF override data. errors: " << error_msg << " | warnings: " << warn_msg << LL_ENDL; } @@ -271,23 +267,27 @@ public: { std::unordered_set<S32> side_set; - for (int i = 0; i < results.size(); ++i) + for (auto const & result : results) { - if (results[i].mSuccess) + S32 side = result.mSide; + if (result.mSuccess) { + // copy to heap here because LLTextureEntry is going to take ownership with an LLPointer + LLGLTFMaterial * material = new LLGLTFMaterial(result.mMaterial); + // flag this side to not be nulled out later - side_set.insert(results[i].mSide); + side_set.insert(side); if (obj) { - obj->setTEGLTFMaterialOverride(results[i].mSide, results[i].mMaterial); + obj->setTEGLTFMaterialOverride(side, material); } } // unblock material editor - if (obj && obj->getTE(results[i].mSide) && obj->getTE(results[i].mSide)->isSelected()) + if (obj && obj->getTE(side) && obj->getTE(side)->isSelected()) { - doSelectionCallbacks(object_override.mObjectId, results[i].mSide); + doSelectionCallbacks(object_override.mObjectId, side); } } |