fix for STORM-1046, STORM-1014, STORM-1047

STORM-1046:[crashhunters] crash in LWorld::removeRegion
STORM-1014: Viewer crash in LLSurface::getWaterHeight
STORM-1047:[crashhunters] crash at LLViewerObjectList::renderObjectsForMap
Early grab from viewer-development before merge with upstream

--HG--
branch : Firestorm_2.4.2
meow-7.2.2
Techwolf Lupindo 2011-03-15 00:22:47 -04:00
parent 129d693a25
commit 5eefe5b9e8
3 changed files with 56 additions and 7 deletions

View File

@ -848,13 +848,14 @@ void LLViewerObjectList::clearDebugText()
void LLViewerObjectList::cleanupReferences(LLViewerObject *objectp)
{
LLMemType mt(LLMemType::MTYPE_OBJECT);
if (mDeadObjects.count(objectp->mID))
if (mDeadObjects.find(objectp->mID) != mDeadObjects.end())
{
llinfos << "Object " << objectp->mID << " already on dead list, ignoring cleanup!" << llendl;
return;
llinfos << "Object " << objectp->mID << " already on dead list!" << llendl;
}
else
{
mDeadObjects.insert(objectp->mID);
}
mDeadObjects.insert(std::pair<LLUUID, LLPointer<LLViewerObject> >(objectp->mID, objectp));
// Cleanup any references we have to this object
// Remove from object map so noone can look it up.
@ -1088,6 +1089,45 @@ void LLViewerObjectList::shiftObjects(const LLVector3 &offset)
LLWorld::getInstance()->shiftRegions(offset);
}
//make sure the region is cleaned up.
void LLViewerObjectList::clearAllMapObjectsInRegion(LLViewerRegion* regionp)
{
std::set<LLViewerObject*> dead_object_list ;
std::set<LLViewerObject*> region_object_list ;
for (vobj_list_t::iterator iter = mMapObjects.begin(); iter != mMapObjects.end(); ++iter)
{
LLViewerObject* objectp = *iter;
if(objectp->isDead())
{
dead_object_list.insert(objectp) ;
}
else if(objectp->getRegion() == regionp)
{
region_object_list.insert(objectp) ;
}
}
if(dead_object_list.size() > 0)
{
llwarns << "There are " << dead_object_list.size() << " dead objects on the map!" << llendl ;
for(std::set<LLViewerObject*>::iterator iter = dead_object_list.begin(); iter != dead_object_list.end(); ++iter)
{
cleanupReferences(*iter) ;
}
}
if(region_object_list.size() > 0)
{
llwarns << "There are " << region_object_list.size() << " objects not removed from the deleted region!" << llendl ;
for(std::set<LLViewerObject*>::iterator iter = region_object_list.begin(); iter != region_object_list.end(); ++iter)
{
(*iter)->markDead() ;
}
}
}
void LLViewerObjectList::renderObjectsForMap(LLNetMap &netmap)
{
LLColor4 above_water_color = LLUIColorTable::instance().getColor( "NetMapOtherOwnAboveWater" );
@ -1106,6 +1146,12 @@ void LLViewerObjectList::renderObjectsForMap(LLNetMap &netmap)
for (vobj_list_t::iterator iter = mMapObjects.begin(); iter != mMapObjects.end(); ++iter)
{
LLViewerObject* objectp = *iter;
if(objectp->isDead())//some dead objects somehow not cleaned.
{
continue ;
}
if (!objectp->getRegion() || objectp->isOrphaned() || objectp->isAttachment())
{
continue;

View File

@ -87,6 +87,7 @@ public:
void shiftObjects(const LLVector3 &offset);
void clearAllMapObjectsInRegion(LLViewerRegion* regionp) ;
void renderObjectsForMap(LLNetMap &netmap);
void renderObjectBounds(const LLVector3 &center);
@ -180,8 +181,7 @@ protected:
vobj_list_t mMapObjects;
typedef std::map<LLUUID, LLPointer<LLViewerObject> > vo_map;
vo_map mDeadObjects; // Need to keep multiple entries per UUID
std::set<LLUUID> mDeadObjects;
std::map<LLUUID, LLPointer<LLViewerObject> > mUUIDObjectMap;

View File

@ -276,6 +276,9 @@ void LLWorld::removeRegion(const LLHost &host)
delete regionp;
updateWaterObjects();
//double check all objects of this region are removed.
gObjectList.clearAllMapObjectsInRegion(regionp) ;
}