diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp
index 30881602ed..6684b046c3 100644
--- a/indra/newview/llviewerobjectlist.cpp
+++ b/indra/newview/llviewerobjectlist.cpp
@@ -1517,6 +1517,11 @@ void LLViewerObjectList::cleanDeadObjects(BOOL use_timer)
S32 num_removed = 0;
LLViewerObject *objectp;
+
+ // Use timer for cleaning up dead objects
+ static const F64 max_time = 0.01; // Let's try 10ms per frame
+ LLTimer timer;
+ //
vobj_list_t::reverse_iterator target = mObjects.rbegin();
@@ -1532,12 +1537,16 @@ void LLViewerObjectList::cleanDeadObjects(BOOL use_timer)
if (objectp->isDead())
{
+ mDeadObjects.erase(objectp->mID); // Use timer for cleaning up dead objects
LLPointer::swap(*iter, *target);
*target = NULL;
++target;
num_removed++;
- if (num_removed == mNumDeadObjects || iter->isNull())
+ // Use timer for cleaning up dead objects
+ //if (num_removed == mNumDeadObjects || iter->isNull())
+ if (num_removed == mNumDeadObjects || iter->isNull() || (use_timer && timer.getElapsedTimeF64() > max_time))
+ //
{
// We've cleaned up all of the dead objects or caught up to the dead tail
break;
@@ -1549,15 +1558,24 @@ void LLViewerObjectList::cleanDeadObjects(BOOL use_timer)
}
}
- llassert(num_removed == mNumDeadObjects);
+ // Use timer for cleaning up dead objects
+ //llassert(num_removed == mNumDeadObjects);
- //erase as a block
- mObjects.erase(mObjects.begin()+(mObjects.size()-mNumDeadObjects), mObjects.end());
+ ////erase as a block
+ //mObjects.erase(mObjects.begin()+(mObjects.size()-mNumDeadObjects), mObjects.end());
- // We've cleaned the global object list, now let's do some paranoia testing on objects
- // before blowing away the dead list.
- mDeadObjects.clear();
- mNumDeadObjects = 0;
+ //// We've cleaned the global object list, now let's do some paranoia testing on objects
+ //// before blowing away the dead list.
+ //mDeadObjects.clear();
+ //mNumDeadObjects = 0;
+ mObjects.erase(mObjects.begin()+(mObjects.size()-num_removed), mObjects.end());
+ mNumDeadObjects -= num_removed;
+
+ if (mNumDeadObjects != mDeadObjects.size())
+ {
+ LL_WARNS() << "Num dead objects != dead object list size" << LL_ENDL;
+ }
+ //
}
void LLViewerObjectList::removeFromActiveList(LLViewerObject* objectp)