From 5d39113ff6aef09574b47339537306b650db653a Mon Sep 17 00:00:00 2001 From: Rye Mutt <rye@alchemyviewer.org> Date: Mon, 28 Oct 2019 22:21:25 -0400 Subject: [PATCH] Fix hotspot from insane amount of singleton instance calls --- indra/newview/llviewerobject.cpp | 12 +++++++++--- indra/newview/llviewerobjectlist.cpp | 11 ++--------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 340c037389..51af760ae1 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -484,6 +484,12 @@ void LLViewerObject::markDead() LLFollowCamMgr::removeFollowCamParams(mID); } + // And finally mark the region as null to prevent invalid calls while object is dead but not cleaned up + if (mRegionp) + { + mRegionp = nullptr; + } + sNumZombieObjects++; } } @@ -4082,7 +4088,7 @@ LLNameValue *LLViewerObject::getNVPair(const std::string& name) const void LLViewerObject::updatePositionCaches() const { // If region is removed from the list it is also deleted. - if(mRegionp && LLWorld::instance().isRegionListed(mRegionp)) + if(mRegionp) { if (!isRoot()) { @@ -4100,7 +4106,7 @@ void LLViewerObject::updatePositionCaches() const const LLVector3d LLViewerObject::getPositionGlobal() const { // If region is removed from the list it is also deleted. - if(mRegionp && LLWorld::instance().isRegionListed(mRegionp)) + if(mRegionp) { LLVector3d position_global = mRegionp->getPosGlobalFromRegion(getPositionRegion()); @@ -4120,7 +4126,7 @@ const LLVector3d LLViewerObject::getPositionGlobal() const const LLVector3 &LLViewerObject::getPositionAgent() const { // If region is removed from the list it is also deleted. - if(mRegionp && LLWorld::instance().isRegionListed(mRegionp)) + if(mRegionp) { if (mDrawable.notNull() && (!mDrawable->isRoot() && getParent())) { diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index 244b18e1a9..90b78d2af4 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -1399,13 +1399,9 @@ BOOL LLViewerObjectList::killObject(LLViewerObject *objectp) void LLViewerObjectList::killObjects(LLViewerRegion *regionp) { - LLViewerObject *objectp; - - for (auto& object : mObjects) + for (LLViewerObject* objectp : mObjects) { - objectp = object; - if (objectp->mRegionp == regionp) { killObject(objectp); @@ -1419,11 +1415,8 @@ void LLViewerObjectList::killObjects(LLViewerRegion *regionp) void LLViewerObjectList::killAllObjects() { // Used only on global destruction. - LLViewerObject *objectp; - - for (auto& object : mObjects) + for (LLViewerObject* objectp : mObjects) { - objectp = object; killObject(objectp); // Object must be dead, or it's the LLVOAvatarSelf which never dies. llassert((objectp == gAgentAvatarp) || objectp->isDead()); -- GitLab