From afc2807302f2a94b5cbb0fe86f304984ac7e50b8 Mon Sep 17 00:00:00 2001
From: Richard Linden <none@none>
Date: Thu, 30 Aug 2012 18:35:29 -0700
Subject: [PATCH] MAINT-1486 FIX Crash on login (Unhandled exception) cleaner
 implementation of llfasttimers...don't bother to share similarly named timers
 just create multiple timers with same name...doesn't break anything

---
 indra/llcommon/llfasttimer.cpp    | 10 ++--------
 indra/llcommon/llfasttimer.h      |  1 +
 indra/newview/llfasttimerview.cpp |  2 ++
 3 files changed, 5 insertions(+), 8 deletions(-)

diff --git a/indra/llcommon/llfasttimer.cpp b/indra/llcommon/llfasttimer.cpp
index ff6806082c6..d54e1a93ea9 100644
--- a/indra/llcommon/llfasttimer.cpp
+++ b/indra/llcommon/llfasttimer.cpp
@@ -128,13 +128,6 @@ class NamedTimerFactory : public LLSingleton<NamedTimerFactory>
 
 	LLFastTimer::NamedTimer& createNamedTimer(const std::string& name, LLFastTimer::FrameState* state)
 	{
-		timer_map_t::iterator found_it = mTimers.find(name);
-		if (found_it != mTimers.end())
-		{
-			llerrs << "Duplicate timer declaration for: " << name << llendl;
-			return *found_it->second;
-		}
-
 		LLFastTimer::NamedTimer* timer = new LLFastTimer::NamedTimer(name);
 		timer->setFrameState(state);
 		timer->setParent(mTimerRoot);
@@ -155,7 +148,7 @@ class NamedTimerFactory : public LLSingleton<NamedTimerFactory>
 
 	LLFastTimer::NamedTimer* getRootTimer() { return mTimerRoot; }
 
-	typedef std::map<std::string, LLFastTimer::NamedTimer*> timer_map_t;
+	typedef std::multimap<std::string, LLFastTimer::NamedTimer*> timer_map_t;
 	timer_map_t::iterator beginTimers() { return mTimers.begin(); }
 	timer_map_t::iterator endTimers() { return mTimers.end(); }
 	S32 timerCount() { return mTimers.size(); }
@@ -294,6 +287,7 @@ S32 LLFastTimer::NamedTimer::getDepth()
 	while(timerp)
 	{
 		depth++;
+		if (timerp->getParent() == timerp) break;
 		timerp = timerp->mParent;
 	}
 	return depth;
diff --git a/indra/llcommon/llfasttimer.h b/indra/llcommon/llfasttimer.h
index e42e549df58..b3f7304664c 100644
--- a/indra/llcommon/llfasttimer.h
+++ b/indra/llcommon/llfasttimer.h
@@ -145,6 +145,7 @@ class LL_COMMON_API LLFastTimer
 		DeclareTimer(const std::string& name);
 
 		NamedTimer& getNamedTimer() { return mTimer; }
+		const NamedTimer& getNamedTimer() const { return mTimer; }
 
 	private:
 		FrameState		mFrameState;
diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp
index 59bf70f4888..4dfb93f1bca 100644
--- a/indra/newview/llfasttimerview.cpp
+++ b/indra/newview/llfasttimerview.cpp
@@ -514,6 +514,7 @@ void LLFastTimerView::draw()
 			while(!is_child_of_hover_item && next_parent)
 			{
 				is_child_of_hover_item = (mHoverID == next_parent);
+				if (next_parent->getParent() == next_parent) break;
 				next_parent = next_parent->getParent();
 			}
 
@@ -781,6 +782,7 @@ void LLFastTimerView::draw()
 					while(!is_child_of_hover_item && next_parent)
 					{
 						is_child_of_hover_item = (mHoverID == next_parent);
+						if (next_parent->getParent() == next_parent) break;
 						next_parent = next_parent->getParent();
 					}
 
-- 
GitLab