diff options
| -rw-r--r-- | indra/llcommon/llsafehandle.h | 22 | 
1 files changed, 16 insertions, 6 deletions
| diff --git a/indra/llcommon/llsafehandle.h b/indra/llcommon/llsafehandle.h index af1c26dd4f..74d31297a0 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 @@ protected:  		}  	} -	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: | 
