diff options
| author | Dave Parks <davep@lindenlab.com> | 2013-06-27 16:16:56 -0500 | 
|---|---|---|
| committer | Dave Parks <davep@lindenlab.com> | 2013-06-27 16:16:56 -0500 | 
| commit | 380785e613b9823cb6160be5678e5f01783fee5f (patch) | |
| tree | dce0f35d02994c861428683b91f64371e9a64ea0 /indra/llcommon/llinstancetracker.h | |
| parent | 21b78d7368f969fdf0daf7994fb565da633b1e71 (diff) | |
| parent | 4696eeeb30ce4d01c3bcbe74c9024f05d848968a (diff) | |
Automated merge with https://bitbucket.org/lindenlab/viewer-development-materials
Diffstat (limited to 'indra/llcommon/llinstancetracker.h')
| -rwxr-xr-x | indra/llcommon/llinstancetracker.h | 30 | 
1 files changed, 11 insertions, 19 deletions
| diff --git a/indra/llcommon/llinstancetracker.h b/indra/llcommon/llinstancetracker.h index 1eab270e3c..361182380a 100755 --- a/indra/llcommon/llinstancetracker.h +++ b/indra/llcommon/llinstancetracker.h @@ -46,21 +46,7 @@  class LL_COMMON_API LLInstanceTrackerBase  {  protected: -	/// Get a process-unique void* pointer slot for the specified type_info -	static void * & getInstances(std::type_info const & info); -	/// Find or create a STATICDATA instance for the specified TRACKED class. -	/// STATICDATA must be default-constructible. -	template<typename STATICDATA, class TRACKED> -	static STATICDATA& getStatic() -	{ -		void *& instances = getInstances(typeid(TRACKED)); -		if (! instances) -		{ -			instances = new STATICDATA; -		} -		return *static_cast<STATICDATA*>(instances); -	}      /// It's not essential to derive your STATICDATA (for use with      /// getStatic()) from StaticBase; it's just that both known @@ -74,6 +60,8 @@ protected:      };  }; +LL_COMMON_API void assert_main_thread(); +  /// This mix-in class adds support for tracking all instances of the specified class parameter T  /// The (optional) key associates a value of type KEY with a given instance of T, for quick lookup  /// If KEY is not provided, then instances are stored in a simple set @@ -81,14 +69,18 @@ protected:  template<typename T, typename KEY = T*>  class LLInstanceTracker : public LLInstanceTrackerBase  { -	typedef LLInstanceTracker<T, KEY> MyT; +	typedef LLInstanceTracker<T, KEY> self_t;  	typedef typename std::map<KEY, T*> InstanceMap;  	struct StaticData: public StaticBase  	{  		InstanceMap sMap;  	}; -	static StaticData& getStatic() { return LLInstanceTrackerBase::getStatic<StaticData, MyT>(); } -	static InstanceMap& getMap_() { return getStatic().sMap; } +	static StaticData& getStatic() { static StaticData sData; return sData;} +	static InstanceMap& getMap_()  +	{ +		// assert_main_thread();   fwiw this class is not thread safe, and it used by multiple threads.  Bad things happen. +		return getStatic().sMap;  +	}  public:  	class instance_iter : public boost::iterator_facade<instance_iter, T, boost::forward_traversal_tag> @@ -232,13 +224,13 @@ private:  template<typename T>  class LLInstanceTracker<T, T*> : public LLInstanceTrackerBase  { -	typedef LLInstanceTracker<T, T*> MyT; +	typedef LLInstanceTracker<T, T*> self_t;  	typedef typename std::set<T*> InstanceSet;  	struct StaticData: public StaticBase  	{  		InstanceSet sSet;  	}; -	static StaticData& getStatic() { return LLInstanceTrackerBase::getStatic<StaticData, MyT>(); } +	static StaticData& getStatic() { static StaticData sData; return sData; }  	static InstanceSet& getSet_() { return getStatic().sSet; }  public: | 
