diff options
| -rw-r--r-- | indra/llcommon/llsingleton.cpp | 1 | ||||
| -rw-r--r-- | indra/llcommon/llsingleton.h | 74 | ||||
| -rw-r--r-- | indra/llcommon/lltracerecording.cpp | 65 | ||||
| -rw-r--r-- | indra/llcommon/lltracerecording.h | 56 | ||||
| -rw-r--r-- | indra/newview/llscenemonitor.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/llscenemonitor.h | 4 | ||||
| -rw-r--r-- | indra/newview/lltoolselect.h | 2 | ||||
| -rw-r--r-- | indra/newview/llviewertexturelist.h | 1 | 
8 files changed, 100 insertions, 105 deletions
| diff --git a/indra/llcommon/llsingleton.cpp b/indra/llcommon/llsingleton.cpp index eb8e2c9456..9b49e52377 100644 --- a/indra/llcommon/llsingleton.cpp +++ b/indra/llcommon/llsingleton.cpp @@ -28,5 +28,4 @@  #include "llsingleton.h" -std::map<std::string, void *> * LLSingletonRegistry::sSingletonMap = NULL; diff --git a/indra/llcommon/llsingleton.h b/indra/llcommon/llsingleton.h index f6b0a7194b..697d1b042a 100644 --- a/indra/llcommon/llsingleton.h +++ b/indra/llcommon/llsingleton.h @@ -30,38 +30,6 @@  #include <typeinfo>  #include <boost/noncopyable.hpp> -/// @brief A global registry of all singletons to prevent duplicate allocations -/// across shared library boundaries -class LL_COMMON_API LLSingletonRegistry { -	private: -		typedef std::map<std::string, void *> TypeMap; -		static TypeMap * sSingletonMap; - -		static void checkInit() -		{ -			if(sSingletonMap == NULL) -			{ -				sSingletonMap = new TypeMap(); -			} -		} - -	public: -		template<typename T> static void * & get() -		{ -			std::string name(typeid(T).name()); - -			checkInit(); - -			// the first entry of the pair returned by insert will be either the existing -			// iterator matching our key, or the newly inserted NULL initialized entry -			// see "Insert element" in http://www.sgi.com/tech/stl/UniqueAssociativeContainer.html -			TypeMap::iterator result = -				sSingletonMap->insert(std::make_pair(name, (void*)NULL)).first; - -			return result->second; -		} -}; -  // LLSingleton implements the getInstance() method part of the Singleton  // pattern. It can't make the derived class constructors protected, though, so  // you have to do that yourself. @@ -90,10 +58,9 @@ template <typename DERIVED_TYPE>  class LLSingleton : private boost::noncopyable  { -protected: +private:  	typedef enum e_init_state  	{ -		UNINITIALIZED,  		CONSTRUCTING,  		INITIALIZING,  		INITIALIZED, @@ -109,8 +76,11 @@ protected:  		SingletonInstanceData()  		:	mSingletonInstance(NULL), -			mInitState(UNINITIALIZED) -		{} +			mInitState(CONSTRUCTING) +		{ +			mSingletonInstance = new DERIVED_TYPE();  +			mInitState = INITIALIZING; +		}  		~SingletonInstanceData()  		{ @@ -151,12 +121,12 @@ public:  	 */  	static void deleteSingleton()  	{ -		SingletonInstanceData& data = getSingletonData(); -		delete data.mSingletonInstance; -		data.mSingletonInstance = NULL; -		data.mInitState = DELETED; +		delete getSingletonData().mSingletonInstance; +		getSingletonData().mSingletonInstance = NULL; +		getSingletonData().mInitState = DELETED;  	} +  	static DERIVED_TYPE* getInstance()  	{  		SingletonInstanceData& data = getSingletonData(); @@ -171,13 +141,11 @@ public:  			llwarns << "Trying to access deleted singleton " << typeid(DERIVED_TYPE).name() << " creating new instance" << llendl;  		} -		if (!data.mSingletonInstance)  +		if (data.mInitState == INITIALIZING)   		{ -			data.mInitState = CONSTRUCTING; -			data.mSingletonInstance = new DERIVED_TYPE();  -			data.mInitState = INITIALIZING; -			data.mSingletonInstance->initSingleton();  +			// go ahead and flag ourselves as initialized so we can be reentrant during initialization  			data.mInitState = INITIALIZED;	 +			data.mSingletonInstance->initSingleton();   		}  		return data.mSingletonInstance; @@ -185,7 +153,7 @@ public:  	static DERIVED_TYPE* getIfExists()  	{ -		SingletonInstanceData& data = getSingletonData(); +		SingletonInstanceData& data = getData();  		return data.mSingletonInstance;  	} @@ -211,20 +179,14 @@ public:  	}  private: +  	static SingletonInstanceData& getSingletonData()  	{  		// this is static to cache the lookup results -		static void * & registry = LLSingletonRegistry::get<DERIVED_TYPE>(); - -		// *TODO - look into making this threadsafe -		if(NULL == registry) -		{ -			static SingletonInstanceData data; -			registry = &data; -		} - -		return *static_cast<SingletonInstanceData *>(registry); +		static SingletonInstanceData sData; +		return sData;  	} +  	virtual void initSingleton() {}  }; diff --git a/indra/llcommon/lltracerecording.cpp b/indra/llcommon/lltracerecording.cpp index 2917c217d7..e562f2bce2 100644 --- a/indra/llcommon/lltracerecording.cpp +++ b/indra/llcommon/lltracerecording.cpp @@ -362,6 +362,10 @@ PeriodicRecording::PeriodicRecording( U32 num_periods, EPlayState state)  :	mAutoResize(num_periods == 0),  	mCurPeriod(0)  { +	if (mAutoResize)  +	{ +		num_periods = 1; +	}  	if (num_periods)  	{  		mRecordingPeriods.resize(num_periods); @@ -464,7 +468,61 @@ void PeriodicRecording::appendPeriodicRecording( PeriodicRecording& other )  	other.setPlayState(other_play_state);  } +LLUnit<LLUnits::Seconds, F64> PeriodicRecording::getDuration() +{ +	LLUnit<LLUnits::Seconds, F64> duration; +	size_t num_periods = mRecordingPeriods.size(); +	for (size_t i = 1; i <= num_periods; i++) +	{ +		size_t index = (mCurPeriod + num_periods - i) % num_periods; +		duration += mRecordingPeriods[index].getDuration(); +	} +	return duration; +} + + +LLTrace::Recording PeriodicRecording::snapshotCurRecording() const +{ +	Recording recording_copy(getCurRecording()); +	recording_copy.stop(); +	return recording_copy; +} + +Recording& PeriodicRecording::getLastRecording() +{ +	U32 num_periods = mRecordingPeriods.size(); +	return mRecordingPeriods[(mCurPeriod + num_periods - 1) % num_periods]; +} + +const Recording& PeriodicRecording::getLastRecording() const +{ +	return getPrevRecording(1); +} + +Recording& PeriodicRecording::getCurRecording() +{ +	return mRecordingPeriods[mCurPeriod]; +} + +const Recording& PeriodicRecording::getCurRecording() const +{ +	return mRecordingPeriods[mCurPeriod]; +} + +Recording& PeriodicRecording::getPrevRecording( U32 offset ) +{ +	U32 num_periods = mRecordingPeriods.size(); +	offset = llclamp(offset, 0u, num_periods - 1); +	return mRecordingPeriods[(mCurPeriod + num_periods - offset) % num_periods]; +} + +const Recording& PeriodicRecording::getPrevRecording( U32 offset ) const +{ +	U32 num_periods = mRecordingPeriods.size(); +	offset = llclamp(offset, 0u, num_periods - 1); +	return mRecordingPeriods[(mCurPeriod + num_periods - offset) % num_periods]; +}  void PeriodicRecording::start()  { @@ -577,6 +635,13 @@ void ExtendableRecording::splitFrom(ExtendableRecording& other)  // ExtendablePeriodicRecording  /////////////////////////////////////////////////////////////////////// + +ExtendablePeriodicRecording::ExtendablePeriodicRecording()  +:	mAcceptedRecording(0),  +	mPotentialRecording(0) +{ +} +  void ExtendablePeriodicRecording::extend()  {  	// stop recording to get latest data diff --git a/indra/llcommon/lltracerecording.h b/indra/llcommon/lltracerecording.h index 23b031b49b..84006a10b8 100644 --- a/indra/llcommon/lltracerecording.h +++ b/indra/llcommon/lltracerecording.h @@ -254,49 +254,16 @@ namespace LLTrace  		void nextPeriod();  		U32 getNumPeriods() { return mRecordingPeriods.size(); } -		void appendPeriodicRecording(PeriodicRecording& other); - -		Recording& getLastRecording() -		{ -			U32 num_periods = mRecordingPeriods.size(); -			return mRecordingPeriods[(mCurPeriod + num_periods - 1) % num_periods]; -		} - -		const Recording& getLastRecording() const -		{ -			return getPrevRecording(1); -		} - -		Recording& getCurRecording() -		{ -			return mRecordingPeriods[mCurPeriod]; -		} - -		const Recording& getCurRecording() const -		{ -			return mRecordingPeriods[mCurPeriod]; -		} - -		Recording& getPrevRecording(U32 offset) -		{ -			U32 num_periods = mRecordingPeriods.size(); -			offset = llclamp(offset, 0u, num_periods - 1); -			return mRecordingPeriods[(mCurPeriod + num_periods - offset) % num_periods]; -		} +		LLUnit<LLUnits::Seconds, F64> getDuration(); -		const Recording& getPrevRecording(U32 offset) const -		{ -			U32 num_periods = mRecordingPeriods.size(); -			offset = llclamp(offset, 0u, num_periods - 1); -			return mRecordingPeriods[(mCurPeriod + num_periods - offset) % num_periods]; -		} - -		Recording snapshotCurRecording() const -		{ -			Recording recording_copy(getCurRecording()); -			recording_copy.stop(); -			return recording_copy; -		} +		void appendPeriodicRecording(PeriodicRecording& other); +		Recording& getLastRecording(); +		const Recording& getLastRecording() const; +		Recording& getCurRecording(); +		const Recording& getCurRecording() const; +		Recording& getPrevRecording(U32 offset); +		const Recording& getPrevRecording(U32 offset) const; +		Recording snapshotCurRecording() const;  		template <typename T>  		typename T::value_t getPeriodMin(const TraceType<T>& stat, size_t num_periods = U32_MAX) const @@ -447,10 +414,11 @@ namespace LLTrace  	:	public LLStopWatchControlsMixin<ExtendablePeriodicRecording>  	{  	public: +		ExtendablePeriodicRecording();  		void extend(); -		PeriodicRecording& getAcceptedRecording() { return mAcceptedRecording; } -		const PeriodicRecording& getAcceptedRecording() const {return mAcceptedRecording;} +		PeriodicRecording& getAcceptedRecording()				{ return mAcceptedRecording; } +		const PeriodicRecording& getAcceptedRecording() const	{return mAcceptedRecording;}  		// implementation for LLStopWatchControlsMixin  		/*virtual*/ void start(); diff --git a/indra/newview/llscenemonitor.cpp b/indra/newview/llscenemonitor.cpp index 15fe77f028..7f7e61cc88 100644 --- a/indra/newview/llscenemonitor.cpp +++ b/indra/newview/llscenemonitor.cpp @@ -73,7 +73,7 @@ LLSceneMonitor::LLSceneMonitor() :  	mFrames[0] = NULL;  	mFrames[1] = NULL; -	mRecording = new LLTrace::ExtendableRecording(); +	mRecording = new LLTrace::ExtendablePeriodicRecording();  	mRecording->start();  } diff --git a/indra/newview/llscenemonitor.h b/indra/newview/llscenemonitor.h index c897b237b6..45a5241924 100644 --- a/indra/newview/llscenemonitor.h +++ b/indra/newview/llscenemonitor.h @@ -63,7 +63,7 @@ public:  	bool isEnabled()const {return mEnabled;}  	bool needsUpdate() const; -	LLTrace::ExtendableRecording* getRecording() const {return mRecording;} +	LLTrace::ExtendablePeriodicRecording* getRecording() const {return mRecording;}  	void dumpToFile(std::string file_name);  	bool hasResults() const { return !mMonitorResults.empty();} @@ -102,7 +102,7 @@ private:  	std::vector<LLAnimPauseRequest> mAvatarPauseHandles; -	LLTrace::ExtendableRecording* mRecording; +	LLTrace::ExtendablePeriodicRecording* mRecording;  	//---------------------------------------  	typedef struct _monitor_result diff --git a/indra/newview/lltoolselect.h b/indra/newview/lltoolselect.h index baa27f6071..74dababe8c 100644 --- a/indra/newview/lltoolselect.h +++ b/indra/newview/lltoolselect.h @@ -34,7 +34,7 @@  class LLObjectSelection; -class LLToolSelect : public LLTool, public LLSingleton<LLToolSelect> +class LLToolSelect : public LLTool  {  public:  	LLToolSelect( LLToolComposite* composite ); diff --git a/indra/newview/llviewertexturelist.h b/indra/newview/llviewertexturelist.h index e3df71cca2..7ce4a8fc70 100644 --- a/indra/newview/llviewertexturelist.h +++ b/indra/newview/llviewertexturelist.h @@ -34,6 +34,7 @@  #include "llui.h"  #include <list>  #include <set> +#include "lluiimage.h"  const U32 LL_IMAGE_REZ_LOSSLESS_CUTOFF = 128; | 
