diff options
| -rw-r--r-- | indra/llcommon/llinstancetracker.h | 21 | ||||
| -rw-r--r-- | indra/llcommon/tests/llinstancetracker_test.cpp | 7 | 
2 files changed, 23 insertions, 5 deletions
| diff --git a/indra/llcommon/llinstancetracker.h b/indra/llcommon/llinstancetracker.h index 34d841a4e0..403df08990 100644 --- a/indra/llcommon/llinstancetracker.h +++ b/indra/llcommon/llinstancetracker.h @@ -167,8 +167,9 @@ public:  	static T* getInstance(const KEY& k)  	{ -		typename InstanceMap::const_iterator found = getMap_().find(k); -		return (found == getMap_().end()) ? NULL : found->second; +		const InstanceMap& map(getMap_()); +		typename InstanceMap::const_iterator found = map.find(k); +		return (found == map.end()) ? NULL : found->second;  	}  	static instance_iter beginInstances()  @@ -239,8 +240,20 @@ class LLInstanceTracker<T, T*> : public LLInstanceTrackerBase  public: -	/// for completeness of analogy with the generic implementation -	static T* getInstance(T* k) { return k; } +	/** +	 * Does a particular instance still exist? Of course, if you already have +	 * a T* in hand, you need not call getInstance() to @em locate the +	 * instance -- unlike the case where getInstance() accepts some kind of +	 * key. Nonetheless this method is still useful to @em validate a +	 * particular T*, since each instance's destructor removes itself from the +	 * underlying set. +	 */ +	static T* getInstance(T* k) +	{ +		const InstanceSet& set(getSet_()); +		typename InstanceSet::const_iterator found = set.find(k); +		return (found == set.end())? NULL : *found; +	}  	static S32 instanceCount() { return getSet_().size(); }  	class instance_iter : public boost::iterator_facade<instance_iter, T, boost::forward_traversal_tag> diff --git a/indra/llcommon/tests/llinstancetracker_test.cpp b/indra/llcommon/tests/llinstancetracker_test.cpp index b34d1c5fd3..294e21bac5 100644 --- a/indra/llcommon/tests/llinstancetracker_test.cpp +++ b/indra/llcommon/tests/llinstancetracker_test.cpp @@ -95,6 +95,7 @@ namespace tut      void object::test<2>()      {          ensure_equals(Unkeyed::instanceCount(), 0); +        Unkeyed* dangling = NULL;          {              Unkeyed one;              ensure_equals(Unkeyed::instanceCount(), 1); @@ -107,7 +108,11 @@ namespace tut                  ensure_equals(found, two.get());              }              ensure_equals(Unkeyed::instanceCount(), 1); -        } +            // store an unwise pointer to a temp Unkeyed instance +            dangling = &one; +        } // make that instance vanish +        // check the now-invalid pointer to the destroyed instance +        ensure("getInstance(T*) failed to track destruction", ! Unkeyed::getInstance(dangling));          ensure_equals(Unkeyed::instanceCount(), 0);      } | 
