From 29dd5f0123a89f44688477d04a421b90d1efe635 Mon Sep 17 00:00:00 2001
From: Nat Goodspeed <nat@lindenlab.com>
Date: Thu, 27 Apr 2017 18:49:33 -0400
Subject: [PATCH] DRTVWR-418: Use (protected) LLSingleton to store "null
 instance" of LLSafeHandle's referenced type. Using LLSingleton gives us a
 well-defined time at which the "null instance" is deleted:
 LLSingletonBase::deleteAll().

---
 indra/llcommon/llsafehandle.h | 22 ++++++++++++++++------
 1 file changed, 16 insertions(+), 6 deletions(-)

diff --git a/indra/llcommon/llsafehandle.h b/indra/llcommon/llsafehandle.h
index af1c26dd4f5..74d31297a04 100644
--- a/indra/llcommon/llsafehandle.h
+++ b/indra/llcommon/llsafehandle.h
@@ -27,6 +27,7 @@
 #define LLSAFEHANDLE_H
 
 #include "llerror.h"	// *TODO: consider eliminating this
+#include "llsingleton.h"
 
 // Expands LLPointer to return a pointer to a special instance of class Type instead of NULL.
 // This is useful in instances where operations on NULL pointers are semantically safe and/or
@@ -146,15 +147,24 @@ class LLSafeHandle
 		}
 	}
 
-	static Type* nonNull(Type* ptr)
+	// Define an LLSingleton whose sole purpose is to hold a "null instance"
+	// of the subject Type: the canonical instance to dereference if this
+	// LLSafeHandle actually holds a null pointer. We use LLSingleton
+	// specifically so that the "null instance" can be cleaned up at a well-
+	// defined time, specifically LLSingletonBase::deleteAll().
+	// Of course, as with any LLSingleton, the "null instance" is only
+	// instantiated on demand -- in this case, if you actually try to
+	// dereference an LLSafeHandle containing null.
+	class NullInstanceHolder: public LLSingleton<NullInstanceHolder>
 	{
-		return ptr == NULL ? sNullFunc() : ptr;
-	}
+		LLSINGLETON_EMPTY_CTOR(NullInstanceHolder);
+	public:
+		Type mNullInstance;
+	};
 
-	static Type* sNullFunc()
+	static Type* nonNull(Type* ptr)
 	{
-		static Type sInstance;
-		return &sInstance;
+		return ptr? ptr : &NullInstanceHolder::instance().mNullInstance;
 	}
 
 protected:
-- 
GitLab