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