From 3fc39776dd7a347870a5005808c69f27413de424 Mon Sep 17 00:00:00 2001
From: Nat Goodspeed <nat@lindenlab.com>
Date: Wed, 27 May 2015 14:38:51 -0400
Subject: [PATCH] MAINT-5232: Remove dubious polling in
 LLMuteList::getInstance(). The LLMuteList singleton instance might be
 requested before gMessageSystem is constructed. LLMuteList wants to register
 a couple gMessageSystem callbacks. Since gMessageSystem is not (yet) itself
 an LLSingleton, LLMuteList's constructor can't just call it into existence.
 Until now, LLMuteList overrode LLSingleton's getInstance() method: every time
 getInstance() was called, the subclass override method would check whether
 gMessageSystem had been initialized, and if so, register its callbacks before
 forwarding the call to the base-class LLSingleton::getInstance() method.
 Change to use LLPounceable::callWhenReady() instead. This is the reason
 gMessageSystem was made an LLPounceable.

---
 indra/newview/llmutelist.cpp | 29 +++++++++++++----------------
 indra/newview/llmutelist.h   |  5 -----
 2 files changed, 13 insertions(+), 21 deletions(-)

diff --git a/indra/newview/llmutelist.cpp b/indra/newview/llmutelist.cpp
index 681203ef4f0..88bfefa8b8b 100755
--- a/indra/newview/llmutelist.cpp
+++ b/indra/newview/llmutelist.cpp
@@ -47,6 +47,7 @@
 #include "pipeline.h"
 
 #include <boost/tokenizer.hpp>
+#include <boost/bind.hpp>
 
 #include "lldispatcher.h"
 #include "llxfermanager.h"
@@ -146,22 +147,6 @@ std::string LLMute::getDisplayType() const
 	}
 }
 
-
-/* static */
-LLMuteList* LLMuteList::getInstance()
-{
-	// Register callbacks at the first time that we find that the message system has been created.
-	static BOOL registered = FALSE;
-	if( !registered && gMessageSystem)
-	{
-		registered = TRUE;
-		// Register our various callbacks
-		gMessageSystem->setHandlerFuncFast(_PREHASH_MuteListUpdate, processMuteListUpdate);
-		gMessageSystem->setHandlerFuncFast(_PREHASH_UseCachedMuteList, processUseCachedMuteList);
-	}
-	return LLSingleton<LLMuteList>::getInstance(); // Call the "base" implementation.
-}
-
 //-----------------------------------------------------------------------------
 // LLMuteList()
 //-----------------------------------------------------------------------------
@@ -169,6 +154,18 @@ LLMuteList::LLMuteList() :
 	mIsLoaded(FALSE)
 {
 	gGenericDispatcher.addHandler("emptymutelist", &sDispatchEmptyMuteList);
+
+	// Register our callbacks. We may be constructed before gMessageSystem, so
+	// use callWhenReady() to register them as soon as gMessageSystem becomes
+	// available.
+	// When using bind(), must be explicit about default arguments such as
+	// that last NULL.
+	gMessageSystem.callWhenReady(boost::bind(&LLMessageSystem::setHandlerFuncFast, _1,
+											 _PREHASH_MuteListUpdate, processMuteListUpdate,
+											 static_cast<void**>(NULL)));
+	gMessageSystem.callWhenReady(boost::bind(&LLMessageSystem::setHandlerFuncFast, _1,
+											 _PREHASH_UseCachedMuteList, processUseCachedMuteList,
+											 static_cast<void**>(NULL)));
 }
 
 //-----------------------------------------------------------------------------
diff --git a/indra/newview/llmutelist.h b/indra/newview/llmutelist.h
index 3e998b4f0e2..d315f225bfb 100755
--- a/indra/newview/llmutelist.h
+++ b/indra/newview/llmutelist.h
@@ -84,11 +84,6 @@ class LLMuteList : public LLSingleton<LLMuteList>
 	LLMuteList();
 	~LLMuteList();
 
-	// Implemented locally so that we can perform some delayed initialization. 
-	// Callers should be careful to call this one and not LLSingleton<LLMuteList>::getInstance()
-	// which would circumvent that mechanism. -MG
-	static LLMuteList* getInstance();
-
 	void addObserver(LLMuteListObserver* observer);
 	void removeObserver(LLMuteListObserver* observer);
 
-- 
GitLab