fix for SH-648: Crash on exit in LLViewerFetchedTexture (ref count error)

meow-7.2.2
Xiaohong Bao 2010-12-22 10:55:48 -07:00
parent 8bca21e23b
commit 8ba0baa631
5 changed files with 31 additions and 11 deletions

View File

@ -1262,6 +1262,7 @@ bool LLAppViewer::mainLoop()
break;
}
}
gMeshRepo.update() ;
if(!total_work_pending) //pause texture fetching threads if nothing to process.
{

View File

@ -475,10 +475,10 @@ void LLFloaterModelPreview::onPreviewLODCommit(LLUICtrl* ctrl, void* userdata)
S32 which_mode = 0;
LLComboBox* combo = (LLComboBox*) ctrl;
which_mode = (NUM_LOD-1)-combo->getFirstSelectedIndex(); // combo box list of lods is in reverse order
LLComboBox* combo = (LLComboBox*) ctrl;
which_mode = (NUM_LOD-1)-combo->getFirstSelectedIndex(); // combo box list of lods is in reverse order
fp->mModelPreview->setPreviewLOD(which_mode);
}

View File

@ -52,7 +52,7 @@ class domTranslate;
class LLMenuButton;
class LLToggleableMenu;
const S32 NUM_LOD = 4;
const S32 NUM_LOD = 4;
class LLModelLoader : public LLThread
{

View File

@ -1486,7 +1486,7 @@ void LLMeshUploadThread::run()
{
textures.insert(material_iter->mDiffuseMap);
LLTextureUploadData data(material_iter->mDiffuseMap, material_iter->mDiffuseMapLabel);
LLTextureUploadData data(material_iter->mDiffuseMap.get(), material_iter->mDiffuseMapLabel);
uploadTexture(data);
}
}
@ -2135,6 +2135,24 @@ void LLMeshRepository::shutdown()
LLConvexDecomposition::quitSystem();
}
//called in the main thread.
S32 LLMeshRepository::update()
{
if(mUploadWaitList.empty())
{
return 0 ;
}
S32 size = mUploadWaitList.size() ;
for (S32 i = 0; i < size; ++i)
{
mUploads.push_back(mUploadWaitList[i]);
mUploadWaitList[i]->start() ;
}
mUploadWaitList.clear() ;
return size ;
}
S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_params, S32 detail)
{
@ -2654,8 +2672,7 @@ void LLMeshRepository::uploadModel(std::vector<LLModelInstance>& data, LLVector3
bool upload_skin, bool upload_joints)
{
LLMeshUploadThread* thread = new LLMeshUploadThread(data, scale, upload_textures, upload_skin, upload_joints);
mUploads.push_back(thread);
thread->start();
mUploadWaitList.push_back(thread);
}
S32 LLMeshRepository::getMeshSize(const LLUUID& mesh_id, S32 lod)
@ -2742,7 +2759,7 @@ void LLMeshUploadThread::sendCostRequest(LLMeshUploadData& data)
void LLMeshUploadThread::sendCostRequest(LLTextureUploadData& data)
{
if (data.mTexture.notNull() && data.mTexture->getDiscardLevel() >= 0)
if (data.mTexture && data.mTexture->getDiscardLevel() >= 0)
{
LLSD asset_resources = LLSD::emptyMap();

View File

@ -65,7 +65,7 @@ public:
class LLTextureUploadData
{
public:
LLPointer<LLViewerFetchedTexture> mTexture;
LLViewerFetchedTexture* mTexture;
LLUUID mUUID;
std::string mRSVP;
std::string mLabel;
@ -399,7 +399,7 @@ public:
std::queue<LLTextureUploadData> mTextureQ;
std::queue<LLTextureUploadData> mConfirmedTextureQ;
std::map<LLPointer<LLViewerFetchedTexture>, LLTextureUploadData> mTextureMap;
std::map<LLViewerFetchedTexture*, LLTextureUploadData> mTextureMap;
LLMeshUploadThread(instance_list& data, LLVector3& scale, bool upload_textures,
bool upload_skin, bool upload_joints);
@ -442,6 +442,7 @@ public:
void init();
void shutdown();
S32 update() ;
//mesh management functions
S32 loadMesh(LLVOVolume* volume, const LLVolumeParams& mesh_params, S32 detail = 0);
@ -505,6 +506,7 @@ public:
LLMeshRepoThread* mThread;
std::vector<LLMeshUploadThread*> mUploads;
std::vector<LLMeshUploadThread*> mUploadWaitList;
LLPhysicsDecomp* mDecompThread;