summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXiaohong Bao <bao@lindenlab.com>2013-08-06 18:03:23 -0600
committerXiaohong Bao <bao@lindenlab.com>2013-08-06 18:03:23 -0600
commitbe8d04c358086d6650fe7a8195949ba6c11096ae (patch)
treef9c6d8b62c9dfee772c549de309a35682b4a20bc
parentddef4d7ff74ecff49e76afca58d1d3c2486e8af3 (diff)
fix for SH-4398: Interesting: viewer crash in LLVOCacheEntry::updateParentBoundingInfo
-rwxr-xr-xindra/newview/llviewerregion.cpp15
-rwxr-xr-xindra/newview/llvocache.cpp22
-rwxr-xr-xindra/newview/llvocache.h2
3 files changed, 37 insertions, 2 deletions
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index 47e59d3c00..49bb05d88e 100755
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -866,8 +866,19 @@ void LLViewerRegion::killCacheEntry(LLVOCacheEntry* entry)
//remove from the forced visible list
mImpl->mVisibleEntries.erase(entry);
- //kill LLViewerObject if exists
- //this should be done by the rendering pipeline automatically.
+ //disconnect from parent if it is a child
+ if(entry->getParentID() > 0)
+ {
+ LLVOCacheEntry* parent = getCacheEntry(entry->getParentID());
+ if(parent)
+ {
+ parent->removeChild(entry);
+ }
+ }
+ else if(entry->getNumOfChildren() > 0)//disconnect children if has any
+ {
+ entry->removeAllChildren();
+ }
entry->setState(LLVOCacheEntry::INACTIVE);
diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp
index 9beb81bcdd..1b68fee4c1 100755
--- a/indra/newview/llvocache.cpp
+++ b/indra/newview/llvocache.cpp
@@ -263,6 +263,28 @@ void LLVOCacheEntry::addChild(LLVOCacheEntry* entry)
}
}
+void LLVOCacheEntry::removeChild(LLVOCacheEntry* entry)
+{
+ for(S32 i = 0; i < mChildrenList.size(); i++)
+ {
+ if(mChildrenList[i] == entry)
+ {
+ entry->setParentID(0);
+ mChildrenList[i] = mChildrenList[mChildrenList.size() - 1];
+ mChildrenList.pop_back();
+ }
+ }
+}
+
+void LLVOCacheEntry::removeAllChildren()
+{
+ for(S32 i = 0; i < mChildrenList.size(); i++)
+ {
+ mChildrenList[i]->setParentID(0);
+ }
+ mChildrenList.clear();
+}
+
LLDataPackerBinaryBuffer *LLVOCacheEntry::getDP(U32 crc)
{
if ( (mCRC != crc)
diff --git a/indra/newview/llvocache.h b/indra/newview/llvocache.h
index 7de8185315..ef9edf991b 100755
--- a/indra/newview/llvocache.h
+++ b/indra/newview/llvocache.h
@@ -107,6 +107,8 @@ public:
U32 getParentID() const {return mParentID;}
void addChild(LLVOCacheEntry* entry);
+ void removeChild(LLVOCacheEntry* entry);
+ void removeAllChildren();
LLVOCacheEntry* getChild(S32 i) {return mChildrenList[i];}
S32 getNumOfChildren() {return mChildrenList.size();}
void clearChildrenList() {mChildrenList.clear();}