From 1ce49f764fa00406088f7bcd7623603baedd5fe8 Mon Sep 17 00:00:00 2001
From: AlexanderP ProductEngine <apaschenko@productengine.com>
Date: Mon, 3 Dec 2012 19:20:11 +0200
Subject: [PATCH] CHUI-532 FIXED (Viewer crash when user in conversation is
 removed from participant list because they logged out or teleported away)
 delayed destroy of the timer

---
 indra/llui/llbutton.cpp              | 2 +-
 indra/llui/llflashtimer.cpp          | 9 ++++++++-
 indra/llui/llflashtimer.h            | 6 ++++++
 indra/newview/llconversationview.cpp | 2 +-
 4 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp
index 97547208ecc..f82cdc64a9c 100644
--- a/indra/llui/llbutton.cpp
+++ b/indra/llui/llbutton.cpp
@@ -286,7 +286,7 @@ LLButton::~LLButton()
 
 	if (mFlashingTimer)
 	{
-		delete mFlashingTimer;
+		mFlashingTimer->unset();
 	}
 }
 
diff --git a/indra/llui/llflashtimer.cpp b/indra/llui/llflashtimer.cpp
index de7a4ab2658..e49628acd59 100644
--- a/indra/llui/llflashtimer.cpp
+++ b/indra/llui/llflashtimer.cpp
@@ -35,6 +35,7 @@ LLFlashTimer::LLFlashTimer(callback_t cb, S32 count, F32 period)
 		, mCurrentTickCount(0)
         , mIsFlashingInProgress(false)
         , mIsCurrentlyHighlighted(false)
+        , mUnset(false)
 {
 	mEventTimer.stop();
 
@@ -48,6 +49,12 @@ LLFlashTimer::LLFlashTimer(callback_t cb, S32 count, F32 period)
 	}
 }
 
+void LLFlashTimer::unset()
+{
+	mUnset = true;
+	mCallback = NULL;
+}
+
 BOOL LLFlashTimer::tick()
 {
 	mIsCurrentlyHighlighted = !mIsCurrentlyHighlighted;
@@ -62,7 +69,7 @@ BOOL LLFlashTimer::tick()
 		stopFlashing();
 	}
 
-	return FALSE;
+	return mUnset;
 }
 
 void LLFlashTimer::startFlashing()
diff --git a/indra/llui/llflashtimer.h b/indra/llui/llflashtimer.h
index 5c8860b0977..c60f99a8eac 100644
--- a/indra/llui/llflashtimer.h
+++ b/indra/llui/llflashtimer.h
@@ -52,6 +52,11 @@ class LLFlashTimer : public LLEventTimer
 
 	bool isFlashingInProgress();
 	bool isCurrentlyHighlighted();
+	/*
+	 * Use this instead of deleting this object.
+	 * The next call to tick() will return true and that will destroy this object.
+	 */
+	void unset();
 
 private:
 	callback_t		mCallback;
@@ -62,6 +67,7 @@ class LLFlashTimer : public LLEventTimer
 	S32 mCurrentTickCount;
 	bool mIsCurrentlyHighlighted;
 	bool mIsFlashingInProgress;
+	bool mUnset;
 };
 
 #endif /* LL_FLASHTIMER_H */
diff --git a/indra/newview/llconversationview.cpp b/indra/newview/llconversationview.cpp
index 1b1d61e6d63..40900dce54d 100755
--- a/indra/newview/llconversationview.cpp
+++ b/indra/newview/llconversationview.cpp
@@ -95,7 +95,7 @@ LLConversationViewSession::~LLConversationViewSession()
 		LLVoiceClient::getInstance()->removeObserver(mVoiceClientObserver);
 	}
 
-	delete mFlashTimer;
+	mFlashTimer->unset();
 }
 
 bool LLConversationViewSession::isHighlightAllowed()
-- 
GitLab