diff options
| -rw-r--r-- | indra/newview/llappviewer.cpp | 22 | ||||
| -rw-r--r-- | indra/newview/lltexturefetch.cpp | 201 | ||||
| -rwxr-xr-x | indra/newview/llviewerassetstats.cpp | 867 | ||||
| -rwxr-xr-x | indra/newview/llviewerassetstats.h | 141 | ||||
| -rw-r--r-- | indra/newview/llviewerassetstorage.cpp | 6 | ||||
| -rwxr-xr-x | indra/newview/tests/llviewerassetstats_test.cpp | 118 | 
6 files changed, 494 insertions, 861 deletions
| diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 4ab0e3336a..559f427de6 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -4278,10 +4278,6 @@ void LLAppViewer::idle()  				gObjectList.mNumUnknownUpdates = 0;  			} -			// ViewerMetrics FPS piggy-backing on the debug timer. -			// The 5-second interval is nice for this purpose.  If the object debug -			// bit moves or is disabled, please give this a suitable home. -			LLViewerAssetStatsFF::record_fps_main(gFPSClamped);  			LLViewerAssetStatsFF::record_avatar_stats();  		}  	} @@ -5220,17 +5216,7 @@ void LLAppViewer::metricsUpdateRegion(U64 region_handle)  {  	if (0 != region_handle)  	{ -		LLViewerAssetStatsFF::set_region_main(region_handle); -		if (LLAppViewer::sTextureFetch) -		{ -			// Send a region update message into 'thread1' to get the new region. -			LLAppViewer::sTextureFetch->commandSetRegion(region_handle); -		} -		else -		{ -			// No 'thread1', a.k.a. TextureFetch, so update directly -			LLViewerAssetStatsFF::set_region_thread1(region_handle); -		} +		LLViewerAssetStatsFF::set_region(region_handle);  	}  } @@ -5241,7 +5227,7 @@ void LLAppViewer::metricsUpdateRegion(U64 region_handle)   */  void LLAppViewer::metricsSend(bool enable_reporting)  { -	if (! gViewerAssetStatsMain) +	if (! gViewerAssetStats)  		return;  	if (LLAppViewer::sTextureFetch) @@ -5254,7 +5240,7 @@ void LLAppViewer::metricsSend(bool enable_reporting)  			// Make a copy of the main stats to send into another thread.  			// Receiving thread takes ownership. -			LLViewerAssetStats * main_stats(new LLViewerAssetStats(*gViewerAssetStatsMain)); +			LLViewerAssetStats * main_stats(new LLViewerAssetStats(*gViewerAssetStats));  			// Send a report request into 'thread1' to get the rest of the data  			// and provide some additional parameters while here. @@ -5273,6 +5259,6 @@ void LLAppViewer::metricsSend(bool enable_reporting)  	// Reset even if we can't report.  Rather than gather up a huge chunk of  	// data, we'll keep to our sampling interval and retain the data  	// resolution in time. -	gViewerAssetStatsMain->reset(); +	gViewerAssetStats->reset();  } diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index 8ddaac5cc8..903fd6acee 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -368,15 +368,15 @@ public:  			if (worker->mMetricsStartTime)  			{ -				LLViewerAssetStatsFF::record_response_thread1(LLViewerAssetType::AT_TEXTURE, -															  true, -															  LLImageBase::TYPE_AVATAR_BAKE == worker->mType, -															  LLViewerAssetStatsFF::get_timestamp() - worker->mMetricsStartTime); +				LLViewerAssetStatsFF::record_response(LLViewerAssetType::AT_TEXTURE, +													true, +													LLImageBase::TYPE_AVATAR_BAKE == worker->mType, +													LLViewerAssetStatsFF::get_timestamp() - worker->mMetricsStartTime);  				worker->mMetricsStartTime = 0;  			} -			LLViewerAssetStatsFF::record_dequeue_thread1(LLViewerAssetType::AT_TEXTURE, -														 true, -														 LLImageBase::TYPE_AVATAR_BAKE == worker->mType); +			LLViewerAssetStatsFF::record_dequeue(LLViewerAssetType::AT_TEXTURE, +												true, +												LLImageBase::TYPE_AVATAR_BAKE == worker->mType);  		}  		else  		{ @@ -400,109 +400,6 @@ private:  	bool mFollowRedir;  }; -////////////////////////////////////////////////////////////////////////////// - -// Cross-thread messaging for asset metrics. - -/** - * @brief Base class for cross-thread requests made of the fetcher - * - * I believe the intent of the LLQueuedThread class was to - * have these operations derived from LLQueuedThread::QueuedRequest - * but the texture fetcher has elected to manage the queue - * in its own manner.  So these are free-standing objects which are - * managed in simple FIFO order on the mCommands queue of the - * LLTextureFetch object. - * - * What each represents is a simple command sent from an - * outside thread into the TextureFetch thread to be processed - * in order and in a timely fashion (though not an absolute - * higher priority than other operations of the thread). - * Each operation derives a new class from the base customizing - * members, constructors and the doWork() method to effect - * the command. - * - * The flow is one-directional.  There are two global instances - * of the LLViewerAssetStats collector, one for the main program's - * thread pointed to by gViewerAssetStatsMain and one for the - * TextureFetch thread pointed to by gViewerAssetStatsThread1. - * Common operations has each thread recording metrics events - * into the respective collector unconcerned with locking and - * the state of any other thread.  But when the agent moves into - * a different region or the metrics timer expires and a report - * needs to be sent back to the grid, messaging across threads - * is required to distribute data and perform global actions. - * In pseudo-UML, it looks like: - * - *                       Main                 Thread1 - *                        .                      . - *                        .                      . - *                     +-----+                   . - *                     | AM  |                   . - *                     +--+--+                   . - *      +-------+         |                      . - *      | Main  |      +--+--+                   . - *      |       |      | SRE |---.               . - *      | Stats |      +-----+    \              . - *      |       |         |        \  (uuid)  +-----+ - *      | Coll. |      +--+--+      `-------->| SR  | - *      +-------+      | MSC |                +--+--+ - *         | ^         +-----+                   | - *         | |  (uuid)  / .                   +-----+ (uuid) - *         |  `--------'  .                   | MSC |---------. - *         |              .                   +-----+         | - *         |           +-----+                   .            v - *         |           | TE  |                   .        +-------+ - *         |           +--+--+                   .        | Thd1  | - *         |              |                      .        |       | - *         |           +-----+                   .        | Stats | - *          `--------->| RSC |                   .        |       | - *                     +--+--+                   .        | Coll. | - *                        |                      .        +-------+ - *                     +--+--+                   .            | - *                     | SME |---.               .            | - *                     +-----+    \              .            | - *                        .        \ (clone)  +-----+         | - *                        .         `-------->| SM  |         | - *                        .                   +--+--+         | - *                        .                      |            | - *                        .                   +-----+         | - *                        .                   | RSC |<--------' - *                        .                   +-----+ - *                        .                      | - *                        .                   +-----+ - *                        .                   | CP  |--> HTTP POST - *                        .                   +-----+ - *                        .                      . - *                        .                      . - * - * - * Key: - * - * SRE - Set Region Enqueued.  Enqueue a 'Set Region' command in - *       the other thread providing the new UUID of the region. - *       TFReqSetRegion carries the data. - * SR  - Set Region.  New region UUID is sent to the thread-local - *       collector. - * SME - Send Metrics Enqueued.  Enqueue a 'Send Metrics' command - *       including an ownership transfer of a cloned LLViewerAssetStats. - *       TFReqSendMetrics carries the data. - * SM  - Send Metrics.  Global metrics reporting operation.  Takes - *       the cloned stats from the command, merges it with the - *       thread's local stats, converts to LLSD and sends it on - *       to the grid. - * AM  - Agent Moved.  Agent has completed some sort of move to a - *       new region. - * TE  - Timer Expired.  Metrics timer has expired (on the order - *       of 10 minutes). - * CP  - CURL Post - * MSC - Modify Stats Collector.  State change in the thread-local - *       collector.  Typically a region change which affects the - *       global pointers used to find the 'current stats'. - * RSC - Read Stats Collector.  Extract collector data cloning it - *       (i.e. deep copy) when necessary. - * - */  class LLTextureFetch::TFRequest // : public LLQueuedThread::QueuedRequest  {  public: @@ -522,36 +419,6 @@ namespace  {  /** - * @brief Implements a 'Set Region' cross-thread command. - * - * When an agent moves to a new region, subsequent metrics need - * to be binned into a new or existing stats collection in 1:1 - * relationship with the region.  We communicate this region - * change across the threads involved in the communication with - * this message. - * - * Corresponds to LLTextureFetch::commandSetRegion() - */ -class TFReqSetRegion : public LLTextureFetch::TFRequest -{ -public: -	TFReqSetRegion(U64 region_handle) -		: LLTextureFetch::TFRequest(), -		  mRegionHandle(region_handle) -		{} -	TFReqSetRegion & operator=(const TFReqSetRegion &);	// Not defined - -	virtual ~TFReqSetRegion() -		{} - -	virtual bool doWork(LLTextureFetch * fetcher); -		 -public: -	const U64 mRegionHandle; -}; - - -/**   * @brief Implements a 'Send Metrics' cross-thread command.   *   * This is the big operation.  The main thread gathers metrics @@ -1104,9 +971,9 @@ bool LLTextureFetchWorker::doWork(S32 param)  			{  				mMetricsStartTime = LLViewerAssetStatsFF::get_timestamp();  			} -			LLViewerAssetStatsFF::record_enqueue_thread1(LLViewerAssetType::AT_TEXTURE, -														 false, -														 LLImageBase::TYPE_AVATAR_BAKE == mType); +			LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_TEXTURE, +												false, +												LLImageBase::TYPE_AVATAR_BAKE == mType);  			setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);  			return false; @@ -1121,7 +988,7 @@ bool LLTextureFetchWorker::doWork(S32 param)  			//{  			//   mMetricsStartTime = LLViewerAssetStatsFF::get_timestamp();  			//} -			//LLViewerAssetStatsFF::record_enqueue_thread1(LLViewerAssetType::AT_TEXTURE, false, +			//LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_TEXTURE, false,  			//                                             LLImageBase::TYPE_AVATAR_BAKE == mType);  			//setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);  			return false; @@ -1150,15 +1017,15 @@ bool LLTextureFetchWorker::doWork(S32 param)  			if (mMetricsStartTime)  			{ -				LLViewerAssetStatsFF::record_response_thread1(LLViewerAssetType::AT_TEXTURE, -															  false, -															  LLImageBase::TYPE_AVATAR_BAKE == mType, -															  LLViewerAssetStatsFF::get_timestamp() - mMetricsStartTime); +				LLViewerAssetStatsFF::record_response(LLViewerAssetType::AT_TEXTURE, +													false, +													LLImageBase::TYPE_AVATAR_BAKE == mType, +													LLViewerAssetStatsFF::get_timestamp() - mMetricsStartTime);  				mMetricsStartTime = 0;  			} -			LLViewerAssetStatsFF::record_dequeue_thread1(LLViewerAssetType::AT_TEXTURE, -														 false, -														 LLImageBase::TYPE_AVATAR_BAKE == mType); +			LLViewerAssetStatsFF::record_dequeue(LLViewerAssetType::AT_TEXTURE, +												false, +												LLImageBase::TYPE_AVATAR_BAKE == mType);  		}  		else  		{ @@ -1167,9 +1034,9 @@ bool LLTextureFetchWorker::doWork(S32 param)  			{  				mMetricsStartTime = LLViewerAssetStatsFF::get_timestamp();  			} -			LLViewerAssetStatsFF::record_enqueue_thread1(LLViewerAssetType::AT_TEXTURE, -														 false, -														 LLImageBase::TYPE_AVATAR_BAKE == mType); +			LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_TEXTURE, +												false, +												LLImageBase::TYPE_AVATAR_BAKE == mType);  			setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);  		}  		return false; @@ -1226,9 +1093,9 @@ bool LLTextureFetchWorker::doWork(S32 param)  				{  					mMetricsStartTime = LLViewerAssetStatsFF::get_timestamp();  				} -				LLViewerAssetStatsFF::record_enqueue_thread1(LLViewerAssetType::AT_TEXTURE, -															 true, -															 LLImageBase::TYPE_AVATAR_BAKE == mType); +				LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_TEXTURE, +													true, +													LLImageBase::TYPE_AVATAR_BAKE == mType);  				// Will call callbackHttpGet when curl request completes  				std::vector<std::string> headers; @@ -2848,13 +2715,6 @@ void LLTextureFetch::dump()  // cross-thread command methods -void LLTextureFetch::commandSetRegion(U64 region_handle) -{ -	TFReqSetRegion * req = new TFReqSetRegion(region_handle); - -	cmdEnqueue(req); -} -  void LLTextureFetch::commandSendMetrics(const std::string & caps_url,  										const LLUUID & session_id,  										const LLUUID & agent_id, @@ -2922,19 +2782,6 @@ void LLTextureFetch::cmdDoWork()  namespace  { -/** - * Implements the 'Set Region' command. - * - * Thread:  Thread1 (TextureFetch) - */ -bool -TFReqSetRegion::doWork(LLTextureFetch *) -{ -	LLViewerAssetStatsFF::set_region_thread1(mRegionHandle); - -	return true; -} -  TFReqSendMetrics::~TFReqSendMetrics()  { diff --git a/indra/newview/llviewerassetstats.cpp b/indra/newview/llviewerassetstats.cpp index 44e4c54142..cc15d6433f 100755 --- a/indra/newview/llviewerassetstats.cpp +++ b/indra/newview/llviewerassetstats.cpp @@ -82,95 +82,7 @@  // ------------------------------------------------------  // Global data definitions  // ------------------------------------------------------ -LLViewerAssetStats * gViewerAssetStatsMain(0); -LLViewerAssetStats * gViewerAssetStatsThread1(0); -LLTrace::Count<> LLViewerAssetStats::sEnqueued[EVACCount] = {LLTrace::Count<>("enqueuedassetrequeststemptexturehttp", "Number of temporary texture asset http requests enqueued"), -																LLTrace::Count<>("enqueuedassetrequeststemptextureudp", "Number of temporary texture asset udp requests enqueued"), -																LLTrace::Count<>("enqueuedassetrequestsnontemptexturehttp", "Number of texture asset http requests enqueued"), -																LLTrace::Count<>("enqueuedassetrequestsnontemptextureudp", "Number of texture asset udp requests enqueued"), -																LLTrace::Count<>("enqueuedassetrequestswearableudp", "Number of wearable asset requests enqueued"), -																LLTrace::Count<>("enqueuedassetrequestssoundudp", "Number of sound asset requests enqueued"), -																LLTrace::Count<>("enqueuedassetrequestsgestureudp", "Number of gesture asset requests enqueued"), -																LLTrace::Count<>("enqueuedassetrequestsother", "Number of other asset requests enqueued")}; -LLTrace::Count<> LLViewerAssetStats::sDequeued[EVACCount] = {LLTrace::Count<>("dequeuedassetrequeststemptexturehttp", "Number of temporary texture asset http requests dequeued"), -																LLTrace::Count<>("dequeuedassetrequeststemptextureudp", "Number of temporary texture asset udp requests dequeued"), -																LLTrace::Count<>("dequeuedassetrequestsnontemptexturehttp", "Number of texture asset http requests dequeued"), -																LLTrace::Count<>("dequeuedassetrequestsnontemptextureudp", "Number of texture asset udp requests dequeued"), -																LLTrace::Count<>("dequeuedassetrequestswearableudp", "Number of wearable asset requests dequeued"), -																LLTrace::Count<>("dequeuedassetrequestssoundudp", "Number of sound asset requests dequeued"), -																LLTrace::Count<>("dequeuedassetrequestsgestureudp", "Number of gesture asset requests dequeued"), -																LLTrace::Count<>("dequeuedassetrequestsother", "Number of other asset requests dequeued")}; -LLTrace::Measurement<LLTrace::Seconds> LLViewerAssetStats::sResponse[EVACCount] = {LLTrace::Measurement<LLTrace::Seconds>("assetresponsetimestemptexturehttp", "Time spent responding to temporary texture asset http requests"), -																					LLTrace::Measurement<LLTrace::Seconds>("assetresponsetimestemptextureudp", "Time spent responding to temporary texture asset udp requests"), -																					LLTrace::Measurement<LLTrace::Seconds>("assetresponsetimesnontemptexturehttp", "Time spent responding to texture asset http requests"), -																					LLTrace::Measurement<LLTrace::Seconds>("assetresponsetimesnontemptextureudp", "Time spent responding to texture asset udp requests"), -																					LLTrace::Measurement<LLTrace::Seconds>("assetresponsetimeswearableudp", "Time spent responding to wearable asset requests"), -																					LLTrace::Measurement<LLTrace::Seconds>("assetresponsetimessoundudp", "Time spent responding to sound asset requests"), -																					LLTrace::Measurement<LLTrace::Seconds>("assetresponsetimesgestureudp", "Time spent responding to gesture asset requests"), -																					LLTrace::Measurement<LLTrace::Seconds>("assetresponsetimesother", "Time spent responding to other asset requests")}; - - -// ------------------------------------------------------ -// Local declarations -// ------------------------------------------------------ -namespace -{ - -static LLViewerAssetStats::EViewerAssetCategories -asset_type_to_category(const LLViewerAssetType::EType at, bool with_http, bool is_temp); - -} - -// ------------------------------------------------------ -// LLViewerAssetStats::PerRegionStats struct definition -// ------------------------------------------------------ -void -LLViewerAssetStats::PerRegionStats::reset() -{ -	for (int i(0); i < LL_ARRAY_SIZE(mRequests); ++i) -	{ -		mRequests[i].mEnqueued.reset(); -		mRequests[i].mDequeued.reset(); -		mRequests[i].mResponse.reset(); -	} -	mFPS.reset(); -	 -	mTotalTime = 0; -	mStartTimestamp = LLViewerAssetStatsFF::get_timestamp(); -} - - -void -LLViewerAssetStats::PerRegionStats::merge(const LLViewerAssetStats::PerRegionStats & src) -{ -	// mRegionHandle, mTotalTime, mStartTimestamp are left alone. -	 -	// mFPS -	if (src.mFPS.getCount() && mFPS.getCount()) -	{ -		mFPS.merge(src.mFPS); -	} - -	// Avatar stats - data all comes from main thread, so leave alone. - -	// Requests -	for (int i = 0; i < LL_ARRAY_SIZE(mRequests); ++i) -	{ -		mRequests[i].mEnqueued.merge(src.mRequests[i].mEnqueued); -		mRequests[i].mDequeued.merge(src.mRequests[i].mDequeued); -		mRequests[i].mResponse.merge(src.mRequests[i].mResponse); -	} - -} - - -void -LLViewerAssetStats::PerRegionStats::accumulateTime(duration_t now) -{ -	mTotalTime += (now - mStartTimestamp); -	mStartTimestamp = now; -} - +LLViewerAssetStats * gViewerAssetStats(0);  // ------------------------------------------------------  // LLViewerAssetStats class definition @@ -183,47 +95,25 @@ LLViewerAssetStats::LLViewerAssetStats()  LLViewerAssetStats::LLViewerAssetStats(const LLViewerAssetStats & src) -	: mRegionHandle(src.mRegionHandle), -	  mResetTimestamp(src.mResetTimestamp), -	  mPhaseStats(src.mPhaseStats), -	  mAvatarRezStates(src.mAvatarRezStates) +:	mRegionHandle(src.mRegionHandle), +	mPhaseStats(src.mPhaseStats), +	mAvatarRezStates(src.mAvatarRezStates), +	mRegionRecordings(src.mRegionRecordings)  { -	const PerRegionContainer::const_iterator it_end(src.mRegionStats.end()); -	for (PerRegionContainer::const_iterator it(src.mRegionStats.begin()); it_end != it; ++it) -	{ -		mRegionStats[it->first] = new PerRegionStats(*it->second); -	} -	mCurRegionStats = mRegionStats[mRegionHandle]; +	mCurRecording = &mRegionRecordings[mRegionHandle];  } -void -LLViewerAssetStats::reset() +void LLViewerAssetStats::reset()  {  	// Empty the map of all region stats -	mRegionStats.clear(); - -	// If we have a current stats, reset it, otherwise, as at construction, -	// create a new one as we must always have a current stats block. -	if (mCurRegionStats) -	{ -		mCurRegionStats->reset(); -	} -	else -	{ -		mCurRegionStats = new PerRegionStats(mRegionHandle); -	} +	mRegionRecordings.clear(); -	// And add reference to map -	mRegionStats[mRegionHandle] = mCurRegionStats; - -	// Start timestamp consistent with per-region collector -	mResetTimestamp = mCurRegionStats->mStartTimestamp; +	// initialize new recording for current region +	mCurRecording = &mRegionRecordings[mRegionHandle];  } - -void -LLViewerAssetStats::setRegion(region_handle_t region_handle) +void LLViewerAssetStats::setRegion(region_handle_t region_handle)  {  	if (region_handle == mRegionHandle)  	{ @@ -231,207 +121,386 @@ LLViewerAssetStats::setRegion(region_handle_t region_handle)  		return;  	} -	// Get duration for current set -	const duration_t now = LLViewerAssetStatsFF::get_timestamp(); -	mCurRegionStats->accumulateTime(now); +	mCurRecording->stop(); +	mCurRecording = &mRegionRecordings[region_handle]; +	mCurRecording->start(); -	// Prepare new set -	PerRegionContainer::iterator new_stats = mRegionStats.find(region_handle); -	if (mRegionStats.end() == new_stats) -	{ -		// Haven't seen this region_id before, create a new block and make it current. -		mCurRegionStats = new PerRegionStats(region_handle); -		mRegionStats[region_handle] = mCurRegionStats; -	} -	else -	{ -		mCurRegionStats = new_stats->second; -	} -	mCurRegionStats->mStartTimestamp = now;  	mRegionHandle = region_handle;  } - -void -LLViewerAssetStats::recordGetEnqueued(LLViewerAssetType::EType at, bool with_http, bool is_temp) +void LLViewerAssetStats::recordAvatarStats()  { -	const EViewerAssetCategories eac(asset_type_to_category(at, with_http, is_temp)); -	 -	++(mCurRegionStats->mRequests[int(eac)].mEnqueued); -	sEnqueued[int(eac)].add(1); +	LLVOAvatar::getNearbyRezzedStats(mAvatarRezStates); +	mPhaseStats.clear(); +	mPhaseStats["cloud"] = LLViewerStats::PhaseMap::getPhaseStats("cloud"); +	mPhaseStats["cloud-or-gray"] = LLViewerStats::PhaseMap::getPhaseStats("cloud-or-gray");  } + +struct AssetRequestType : public LLInitParam::Block<AssetRequestType> +{ +	Optional<S32>	enqueued, +					dequeued, +					resp_count; +	Optional<F64>	resp_min, +					resp_max, +					resp_mean; -void -LLViewerAssetStats::recordGetDequeued(LLViewerAssetType::EType at, bool with_http, bool is_temp) +	AssetRequestType() +	:	enqueued("enqueued"), +		dequeued("dequeued"), +		resp_count("resp_count"), +		resp_min("resp_min"), +		resp_max("resp_max"), +		resp_mean("resp_mean") +	{} +}; + +struct FPSStats : public LLInitParam::Block<FPSStats>  { -	const EViewerAssetCategories eac(asset_type_to_category(at, with_http, is_temp)); +	Optional<S32>	count; +	Optional<F64>	min, +					max, +					mean; +	FPSStats() +	:	count("count"), +		min("min"), +		max("max"), +		mean("mean") +	{} +}; + +struct RegionStats : public LLInitParam::Block<RegionStats> +{ +	Optional<AssetRequestType>	get_texture_temp_http, +								get_texture_temp_udp, +								get_texture_non_temp_http, +								get_texture_non_temp_udp, +								get_wearable_udp, +								get_sound_udp, +								get_gesture_udp, +								get_other; +	Optional<FPSStats>			fps; +	Mandatory<S32>				grid_x, +								grid_y; +	Mandatory<F64>				duration; + +	RegionStats() +	:	get_texture_temp_http("get_texture_temp_http"), +		get_texture_temp_udp("get_texture_temp_udp"), +		get_texture_non_temp_http("get_texture_non_temp_http"), +		get_texture_non_temp_udp("get_texture_non_temp_udp"), +		get_wearable_udp("get_wearable_udp"), +		get_sound_udp("get_sound_udp"), +		get_gesture_udp("get_gesture_udp"), +		get_other("get_other"), +		fps("fps"), +		grid_x("grid_x"), +		grid_y("grid_y"), +		duration("duration") +	{} +}; + +struct AvatarRezState : public LLInitParam::Block<AvatarRezState> +{ +	Mandatory<S32>	cloud, +					gray, +					textured; +	AvatarRezState() +	:	cloud("cloud"), +		gray("gray"), +		textured("textured") +	{} +}; + +struct AvatarPhaseStats : public LLInitParam::Block<AvatarPhaseStats> +{ +	Mandatory<LLSD>	cloud, +					cloud_or_gray; -	++(mCurRegionStats->mRequests[int(eac)].mDequeued); -	sDequeued[int(eac)].add(1); -} +	AvatarPhaseStats() +	:	cloud("cloud"), +		cloud_or_gray("cloud-or-gray") +	{} +}; -void -LLViewerAssetStats::recordGetServiced(LLViewerAssetType::EType at, bool with_http, bool is_temp, duration_t duration) +struct AvatarInfo : public LLInitParam::Block<AvatarInfo>  { -	const EViewerAssetCategories eac(asset_type_to_category(at, with_http, is_temp)); +	Mandatory<AvatarRezState> nearby; +	Mandatory<AvatarPhaseStats> phase_stats; -	mCurRegionStats->mRequests[int(eac)].mResponse.record(duration); -	sResponse[int(eac)].sample<LLTrace::Seconds>(duration); -} +	AvatarInfo() +	:	nearby("nearby"), +		phase_stats("phase_stats") +	{} +}; -void -LLViewerAssetStats::recordFPS(F32 fps) +struct AssetStats : public LLInitParam::Block<AssetStats>  { -	mCurRegionStats->mFPS.record(fps); -} +	Multiple<RegionStats>	regions; +	Mandatory<F64>			duration; + +	AssetStats() +	:	regions("regions"), +		duration("duration") +	{} + +}; + +//LLSD LLViewerAssetStats::asLLSD(bool compact_output) +//{ +//	// Top-level tags +//	static const LLSD::String tags[LLViewerAssetStatsFF::EVACCount] =  +//		{ +//			LLSD::String("get_texture_temp_http"), +//			LLSD::String("get_texture_temp_udp"), +//			LLSD::String("get_texture_non_temp_http"), +//			LLSD::String("get_texture_non_temp_udp"), +//			LLSD::String("get_wearable_udp"), +//			LLSD::String("get_sound_udp"), +//			LLSD::String("get_gesture_udp"), +//			LLSD::String("get_other") +//		}; +// +//	// Stats Group Sub-tags. +//	static const LLSD::String enq_tag("enqueued"); +//	static const LLSD::String deq_tag("dequeued"); +//	static const LLSD::String rcnt_tag("resp_count"); +//	static const LLSD::String rmin_tag("resp_min"); +//	static const LLSD::String rmax_tag("resp_max"); +//	static const LLSD::String rmean_tag("resp_mean"); +// +//	// MMM Group Sub-tags. +//	static const LLSD::String cnt_tag("count"); +//	static const LLSD::String min_tag("min"); +//	static const LLSD::String max_tag("max"); +//	static const LLSD::String mean_tag("mean"); +// +//	// Avatar sub-tags +//	static const LLSD::String avatar_tag("avatar"); +//	static const LLSD::String avatar_nearby_tag("nearby"); +//	static const LLSD::String avatar_phase_stats_tag("phase_stats"); +//	 +//	const duration_t now = LLViewerAssetStatsFF::get_timestamp(); +//	mCurRegionStats->accumulateTime(now); +// +//	LLSD regions = LLSD::emptyArray(); +//	for (PerRegionContainer::iterator it = mRegionStats.begin(); +//		 mRegionStats.end() != it; +//		 ++it) +//	{ +//		if (0 == it->first) +//		{ +//			// Never emit NULL UUID/handle in results. +//			continue; +//		} +// +//		PerRegionStats & stats = *it->second; +//		 +//		LLSD reg_stat = LLSD::emptyMap(); +//		 +//		for (int i = 0; i < LL_ARRAY_SIZE(tags); ++i) +//		{ +//			PerRegionStats::prs_group & group(stats.mRequests[i]); +//			 +//			if ((! compact_output) || +//				group.mEnqueued.getCount() || +//				group.mDequeued.getCount() || +//				group.mResponse.getCount()) +//			{ +//				LLSD & slot = reg_stat[tags[i]]; +//				slot = LLSD::emptyMap(); +//				slot[enq_tag] = LLSD(S32(stats.mRequests[i].mEnqueued.getCount())); +//				slot[deq_tag] = LLSD(S32(stats.mRequests[i].mDequeued.getCount())); +//				slot[rcnt_tag] = LLSD(S32(stats.mRequests[i].mResponse.getCount())); +//				slot[rmin_tag] = LLSD(F64(stats.mRequests[i].mResponse.getMin() * 1.0e-6)); +//				slot[rmax_tag] = LLSD(F64(stats.mRequests[i].mResponse.getMax() * 1.0e-6)); +//				slot[rmean_tag] = LLSD(F64(stats.mRequests[i].mResponse.getMean() * 1.0e-6)); +//			} +//		} +// +//		if ((! compact_output) || stats.mFPS.getCount()) +//		{ +//			LLSD & slot = reg_stat["fps"]; +//			slot = LLSD::emptyMap(); +//			slot[cnt_tag] = LLSD(S32(stats.mFPS.getCount())); +//			slot[min_tag] = LLSD(F64(stats.mFPS.getMin())); +//			slot[max_tag] = LLSD(F64(stats.mFPS.getMax())); +//			slot[mean_tag] = LLSD(F64(stats.mFPS.getMean())); +//		} +//		U32 grid_x(0), grid_y(0); +//		grid_from_region_handle(it->first, &grid_x, &grid_y); +//		reg_stat["grid_x"] = LLSD::Integer(grid_x); +//		reg_stat["grid_y"] = LLSD::Integer(grid_y); +//		reg_stat["duration"] = LLSD::Real(stats.mTotalTime * 1.0e-6);		 +//		regions.append(reg_stat); +//	} +// +//	LLSD ret = LLSD::emptyMap(); +//	ret["regions"] = regions; +//	ret["duration"] = LLSD::Real((now - mResetTimestamp) * 1.0e-6); +//	LLSD avatar_info; +//	avatar_info[avatar_nearby_tag] = LLSD::emptyArray(); +//	for (S32 rez_stat=0; rez_stat < mAvatarRezStates.size(); ++rez_stat) +//	{ +//		std::string rez_status_name = LLVOAvatar::rezStatusToString(rez_stat); +//		avatar_info[avatar_nearby_tag][rez_status_name] = mAvatarRezStates[rez_stat]; +//	} +//	avatar_info[avatar_phase_stats_tag]["cloud"] = mPhaseStats["cloud"].asLLSD(); +//	avatar_info[avatar_phase_stats_tag]["cloud-or-gray"] = mPhaseStats["cloud-or-gray"].asLLSD(); +//	ret[avatar_tag] = avatar_info; +//	 +//	return ret; +//} -void -LLViewerAssetStats::recordAvatarStats() -{ -	std::vector<S32> rez_counts; -	LLVOAvatar::getNearbyRezzedStats(rez_counts); -	mAvatarRezStates = rez_counts; -	mPhaseStats.clear(); -	mPhaseStats["cloud"] = LLViewerStats::PhaseMap::getPhaseStats("cloud"); -	mPhaseStats["cloud-or-gray"] = LLViewerStats::PhaseMap::getPhaseStats("cloud-or-gray"); -} +// ------------------------------------------------------ +// Global free-function definitions (LLViewerAssetStatsFF namespace) +// ------------------------------------------------------ -LLSD -LLViewerAssetStats::asLLSD(bool compact_output) +namespace LLViewerAssetStatsFF  { -	// Top-level tags -	static const LLSD::String tags[EVACCount] =  +	static EViewerAssetCategories asset_type_to_category(const LLViewerAssetType::EType at, bool with_http, bool is_temp) +	{ +		// For statistical purposes, we divide GETs into several +		// populations of asset fetches: +		//  - textures which are de-prioritized in the asset system +		//  - wearables (clothing, bodyparts) which directly affect +		//    user experiences when they log in +		//  - sounds +		//  - gestures +		//  - everything else. +		// +		llassert_always(50 == LLViewerAssetType::AT_COUNT); + +		// Multiple asset definitions are floating around so this requires some +		// maintenance and attention. +		static const EViewerAssetCategories asset_to_bin_map[LLViewerAssetType::AT_COUNT] =  		{ -			LLSD::String("get_texture_temp_http"), -			LLSD::String("get_texture_temp_udp"), -			LLSD::String("get_texture_non_temp_http"), -			LLSD::String("get_texture_non_temp_udp"), -			LLSD::String("get_wearable_udp"), -			LLSD::String("get_sound_udp"), -			LLSD::String("get_gesture_udp"), -			LLSD::String("get_other") +			EVACTextureTempHTTPGet,			// (0) AT_TEXTURE +			EVACSoundUDPGet,				// AT_SOUND +			EVACOtherGet,					// AT_CALLINGCARD +			EVACOtherGet,					// AT_LANDMARK +			EVACOtherGet,					// AT_SCRIPT +			EVACWearableUDPGet,				// AT_CLOTHING +			EVACOtherGet,					// AT_OBJECT +			EVACOtherGet,					// AT_NOTECARD +			EVACOtherGet,					// AT_CATEGORY +			EVACOtherGet,					// AT_ROOT_CATEGORY +			EVACOtherGet,					// (10) AT_LSL_TEXT +			EVACOtherGet,					// AT_LSL_BYTECODE +			EVACOtherGet,					// AT_TEXTURE_TGA +			EVACWearableUDPGet,				// AT_BODYPART +			EVACOtherGet,					// AT_TRASH +			EVACOtherGet,					// AT_SNAPSHOT_CATEGORY +			EVACOtherGet,					// AT_LOST_AND_FOUND +			EVACSoundUDPGet,				// AT_SOUND_WAV +			EVACOtherGet,					// AT_IMAGE_TGA +			EVACOtherGet,					// AT_IMAGE_JPEG +			EVACGestureUDPGet,				// (20) AT_ANIMATION +			EVACGestureUDPGet,				// AT_GESTURE +			EVACOtherGet,					// AT_SIMSTATE +			EVACOtherGet,					// AT_FAVORITE +			EVACOtherGet,					// AT_LINK +			EVACOtherGet,					// AT_LINK_FOLDER +			EVACOtherGet,					//  +			EVACOtherGet,					//  +			EVACOtherGet,					//  +			EVACOtherGet,					//  +			EVACOtherGet,					// (30) +			EVACOtherGet,					//  +			EVACOtherGet,					//  +			EVACOtherGet,					//  +			EVACOtherGet,					//  +			EVACOtherGet,					//  +			EVACOtherGet,					//  +			EVACOtherGet,					//  +			EVACOtherGet,					//  +			EVACOtherGet,					//  +			EVACOtherGet,					// (40) +			EVACOtherGet,					//  +			EVACOtherGet,					//  +			EVACOtherGet,					//  +			EVACOtherGet,					//  +			EVACOtherGet,					// +			EVACOtherGet,					//  +			EVACOtherGet,					//  +			EVACOtherGet,					//  +			EVACOtherGet,					// AT_MESH +			// (50)  		}; -	// Stats Group Sub-tags. -	static const LLSD::String enq_tag("enqueued"); -	static const LLSD::String deq_tag("dequeued"); -	static const LLSD::String rcnt_tag("resp_count"); -	static const LLSD::String rmin_tag("resp_min"); -	static const LLSD::String rmax_tag("resp_max"); -	static const LLSD::String rmean_tag("resp_mean"); - -	// MMM Group Sub-tags. -	static const LLSD::String cnt_tag("count"); -	static const LLSD::String min_tag("min"); -	static const LLSD::String max_tag("max"); -	static const LLSD::String mean_tag("mean"); - -	// Avatar sub-tags -	static const LLSD::String avatar_tag("avatar"); -	static const LLSD::String avatar_nearby_tag("nearby"); -	static const LLSD::String avatar_phase_stats_tag("phase_stats"); -	 -	const duration_t now = LLViewerAssetStatsFF::get_timestamp(); -	mCurRegionStats->accumulateTime(now); - -	LLSD regions = LLSD::emptyArray(); -	for (PerRegionContainer::iterator it = mRegionStats.begin(); -		 mRegionStats.end() != it; -		 ++it) -	{ -		if (0 == it->first) +		if (at < 0 || at >= LLViewerAssetType::AT_COUNT)  		{ -			// Never emit NULL UUID/handle in results. -			continue; +			return EVACOtherGet;  		} - -		PerRegionStats & stats = *it->second; -		 -		LLSD reg_stat = LLSD::emptyMap(); -		 -		for (int i = 0; i < LL_ARRAY_SIZE(tags); ++i) +		EViewerAssetCategories ret(asset_to_bin_map[at]); +		if (EVACTextureTempHTTPGet == ret)  		{ -			PerRegionStats::prs_group & group(stats.mRequests[i]); -			 -			if ((! compact_output) || -				group.mEnqueued.getCount() || -				group.mDequeued.getCount() || -				group.mResponse.getCount()) +			// Indexed with [is_temp][with_http] +			static const EViewerAssetCategories texture_bin_map[2][2] =  			{ -				LLSD & slot = reg_stat[tags[i]]; -				slot = LLSD::emptyMap(); -				slot[enq_tag] = LLSD(S32(stats.mRequests[i].mEnqueued.getCount())); -				slot[deq_tag] = LLSD(S32(stats.mRequests[i].mDequeued.getCount())); -				slot[rcnt_tag] = LLSD(S32(stats.mRequests[i].mResponse.getCount())); -				slot[rmin_tag] = LLSD(F64(stats.mRequests[i].mResponse.getMin() * 1.0e-6)); -				slot[rmax_tag] = LLSD(F64(stats.mRequests[i].mResponse.getMax() * 1.0e-6)); -				slot[rmean_tag] = LLSD(F64(stats.mRequests[i].mResponse.getMean() * 1.0e-6)); -			} -		} - -		if ((! compact_output) || stats.mFPS.getCount()) -		{ -			LLSD & slot = reg_stat["fps"]; -			slot = LLSD::emptyMap(); -			slot[cnt_tag] = LLSD(S32(stats.mFPS.getCount())); -			slot[min_tag] = LLSD(F64(stats.mFPS.getMin())); -			slot[max_tag] = LLSD(F64(stats.mFPS.getMax())); -			slot[mean_tag] = LLSD(F64(stats.mFPS.getMean())); -		} -		U32 grid_x(0), grid_y(0); -		grid_from_region_handle(it->first, &grid_x, &grid_y); -		reg_stat["grid_x"] = LLSD::Integer(grid_x); -		reg_stat["grid_y"] = LLSD::Integer(grid_y); -		reg_stat["duration"] = LLSD::Real(stats.mTotalTime * 1.0e-6);		 -		regions.append(reg_stat); -	} - -	LLSD ret = LLSD::emptyMap(); -	ret["regions"] = regions; -	ret["duration"] = LLSD::Real((now - mResetTimestamp) * 1.0e-6); -	LLSD avatar_info; -	avatar_info[avatar_nearby_tag] = LLSD::emptyArray(); -	for (S32 rez_stat=0; rez_stat < mAvatarRezStates.size(); ++rez_stat) -	{ -		std::string rez_status_name = LLVOAvatar::rezStatusToString(rez_stat); -		avatar_info[avatar_nearby_tag][rez_status_name] = mAvatarRezStates[rez_stat]; -	} -	avatar_info[avatar_phase_stats_tag]["cloud"] = mPhaseStats["cloud"].asLLSD(); -	avatar_info[avatar_phase_stats_tag]["cloud-or-gray"] = mPhaseStats["cloud-or-gray"].asLLSD(); -	ret[avatar_tag] = avatar_info; -	 -	return ret; -} - -void -LLViewerAssetStats::merge(const LLViewerAssetStats & src) -{ -	// mRegionHandle, mCurRegionStats and mResetTimestamp are left untouched. -	// Just merge the stats bodies +				{ +					EVACTextureNonTempUDPGet, +					EVACTextureNonTempHTTPGet, +				}, +				{ +					EVACTextureTempUDPGet, +					EVACTextureTempHTTPGet, +				} +			}; -	const PerRegionContainer::const_iterator it_end(src.mRegionStats.end()); -	for (PerRegionContainer::const_iterator it(src.mRegionStats.begin()); it_end != it; ++it) -	{ -		PerRegionContainer::iterator dst(mRegionStats.find(it->first)); -		if (mRegionStats.end() == dst) -		{ -			// Destination is missing data, just make a private copy -			mRegionStats[it->first] = new PerRegionStats(*it->second); -		} -		else -		{ -			dst->second->merge(*it->second); +			ret = texture_bin_map[is_temp][with_http];  		} +		return ret;  	} -} - - -// ------------------------------------------------------ -// Global free-function definitions (LLViewerAssetStatsFF namespace) -// ------------------------------------------------------ - -namespace LLViewerAssetStatsFF -{ +static LLTrace::Count<> sEnqueued[EVACCount] = {LLTrace::Count<>("enqueuedassetrequeststemptexturehttp",  +														"Number of temporary texture asset http requests enqueued"), +													LLTrace::Count<>("enqueuedassetrequeststemptextureudp",  +														"Number of temporary texture asset udp requests enqueued"), +													LLTrace::Count<>("enqueuedassetrequestsnontemptexturehttp",  +														"Number of texture asset http requests enqueued"), +													LLTrace::Count<>("enqueuedassetrequestsnontemptextureudp",  +														"Number of texture asset udp requests enqueued"), +													LLTrace::Count<>("enqueuedassetrequestswearableudp",  +														"Number of wearable asset requests enqueued"), +													LLTrace::Count<>("enqueuedassetrequestssoundudp",  +														"Number of sound asset requests enqueued"), +													LLTrace::Count<>("enqueuedassetrequestsgestureudp",  +														"Number of gesture asset requests enqueued"), +													LLTrace::Count<>("enqueuedassetrequestsother",  +														"Number of other asset requests enqueued")}; + +static LLTrace::Count<> sDequeued[EVACCount] = {LLTrace::Count<>("dequeuedassetrequeststemptexturehttp",  +													"Number of temporary texture asset http requests dequeued"), +												LLTrace::Count<>("dequeuedassetrequeststemptextureudp",  +													"Number of temporary texture asset udp requests dequeued"), +												LLTrace::Count<>("dequeuedassetrequestsnontemptexturehttp",  +													"Number of texture asset http requests dequeued"), +												LLTrace::Count<>("dequeuedassetrequestsnontemptextureudp",  +													"Number of texture asset udp requests dequeued"), +												LLTrace::Count<>("dequeuedassetrequestswearableudp",  +													"Number of wearable asset requests dequeued"), +												LLTrace::Count<>("dequeuedassetrequestssoundudp",  +													"Number of sound asset requests dequeued"), +												LLTrace::Count<>("dequeuedassetrequestsgestureudp",  +													"Number of gesture asset requests dequeued"), +												LLTrace::Count<>("dequeuedassetrequestsother",  +													"Number of other asset requests dequeued")}; +static LLTrace::Measurement<LLTrace::Seconds> sResponse[EVACCount] = {LLTrace::Measurement<LLTrace::Seconds>("assetresponsetimestemptexturehttp",  +																			"Time spent responding to temporary texture asset http requests"), +																		LLTrace::Measurement<LLTrace::Seconds>("assetresponsetimestemptextureudp",  +																			"Time spent responding to temporary texture asset udp requests"), +																		LLTrace::Measurement<LLTrace::Seconds>("assetresponsetimesnontemptexturehttp",  +																			"Time spent responding to texture asset http requests"), +																		LLTrace::Measurement<LLTrace::Seconds>("assetresponsetimesnontemptextureudp",  +																			"Time spent responding to texture asset udp requests"), +																		LLTrace::Measurement<LLTrace::Seconds>("assetresponsetimeswearableudp",  +																			"Time spent responding to wearable asset requests"), +																		LLTrace::Measurement<LLTrace::Seconds>("assetresponsetimessoundudp",  +																			"Time spent responding to sound asset requests"), +																		LLTrace::Measurement<LLTrace::Seconds>("assetresponsetimesgestureudp",  +																			"Time spent responding to gesture asset requests"), +																		LLTrace::Measurement<LLTrace::Seconds>("assetresponsetimesother",  +																			"Time spent responding to other asset requests")};  //  // Target thread is elaborated in the function name.  This could @@ -452,227 +521,59 @@ namespace LLViewerAssetStatsFF  // 'main' thread - initial program thread -void -set_region_main(LLViewerAssetStats::region_handle_t region_handle) +void set_region(LLViewerAssetStats::region_handle_t region_handle)  { -	if (! gViewerAssetStatsMain) +	if (! gViewerAssetStats)  		return; -	gViewerAssetStatsMain->setRegion(region_handle); +	gViewerAssetStats->setRegion(region_handle);  } -void -record_enqueue_main(LLViewerAssetType::EType at, bool with_http, bool is_temp) +void record_enqueue(LLViewerAssetType::EType at, bool with_http, bool is_temp)  { -	if (! gViewerAssetStatsMain) -		return; - -	gViewerAssetStatsMain->recordGetEnqueued(at, with_http, is_temp); -} - -void -record_dequeue_main(LLViewerAssetType::EType at, bool with_http, bool is_temp) -{ -	if (! gViewerAssetStatsMain) -		return; - -	gViewerAssetStatsMain->recordGetDequeued(at, with_http, is_temp); -} - -void -record_response_main(LLViewerAssetType::EType at, bool with_http, bool is_temp, LLViewerAssetStats::duration_t duration) -{ -	if (! gViewerAssetStatsMain) -		return; - -	gViewerAssetStatsMain->recordGetServiced(at, with_http, is_temp, duration); -} - -void -record_fps_main(F32 fps) -{ -	if (! gViewerAssetStatsMain) -		return; - -	gViewerAssetStatsMain->recordFPS(fps); -} - -void -record_avatar_stats() -{ -	if (! gViewerAssetStatsMain) -		return; +	const EViewerAssetCategories eac(asset_type_to_category(at, with_http, is_temp)); -	gViewerAssetStatsMain->recordAvatarStats(); +	sEnqueued[int(eac)].add(1);  } -// 'thread1' - should be for TextureFetch thread - -void -set_region_thread1(LLViewerAssetStats::region_handle_t region_handle) +void record_dequeue(LLViewerAssetType::EType at, bool with_http, bool is_temp)  { -	if (! gViewerAssetStatsThread1) -		return; - -	gViewerAssetStatsThread1->setRegion(region_handle); -} - -void -record_enqueue_thread1(LLViewerAssetType::EType at, bool with_http, bool is_temp) -{ -	if (! gViewerAssetStatsThread1) -		return; +	const EViewerAssetCategories eac(asset_type_to_category(at, with_http, is_temp)); -	gViewerAssetStatsThread1->recordGetEnqueued(at, with_http, is_temp); +	sDequeued[int(eac)].add(1);  } -void -record_dequeue_thread1(LLViewerAssetType::EType at, bool with_http, bool is_temp) +void record_response(LLViewerAssetType::EType at, bool with_http, bool is_temp, LLViewerAssetStats::duration_t duration)  { -	if (! gViewerAssetStatsThread1) -		return; +	const EViewerAssetCategories eac(asset_type_to_category(at, with_http, is_temp)); -	gViewerAssetStatsThread1->recordGetDequeued(at, with_http, is_temp); +	sResponse[int(eac)].sample<LLTrace::Seconds>(duration);  } -void -record_response_thread1(LLViewerAssetType::EType at, bool with_http, bool is_temp, LLViewerAssetStats::duration_t duration) +void record_avatar_stats()  { -	if (! gViewerAssetStatsThread1) +	if (! gViewerAssetStats)  		return; -	gViewerAssetStatsThread1->recordGetServiced(at, with_http, is_temp, duration); +	gViewerAssetStats->recordAvatarStats();  } - -void -init() +void init()  { -	if (! gViewerAssetStatsMain) +	if (! gViewerAssetStats)  	{ -		gViewerAssetStatsMain = new LLViewerAssetStats(); -	} -	if (! gViewerAssetStatsThread1) -	{ -		gViewerAssetStatsThread1 = new LLViewerAssetStats(); +		gViewerAssetStats = new LLViewerAssetStats();  	}  }  void  cleanup()  { -	delete gViewerAssetStatsMain; -	gViewerAssetStatsMain = 0; - -	delete gViewerAssetStatsThread1; -	gViewerAssetStatsThread1 = 0; +	delete gViewerAssetStats; +	gViewerAssetStats = 0;  }  } // namespace LLViewerAssetStatsFF -// ------------------------------------------------------ -// Local function definitions -// ------------------------------------------------------ - -namespace -{ - -LLViewerAssetStats::EViewerAssetCategories -asset_type_to_category(const LLViewerAssetType::EType at, bool with_http, bool is_temp) -{ -	// For statistical purposes, we divide GETs into several -	// populations of asset fetches: -	//  - textures which are de-prioritized in the asset system -	//  - wearables (clothing, bodyparts) which directly affect -	//    user experiences when they log in -	//  - sounds -	//  - gestures -	//  - everything else. -	// -	llassert_always(50 == LLViewerAssetType::AT_COUNT); - -	// Multiple asset definitions are floating around so this requires some -	// maintenance and attention. -	static const LLViewerAssetStats::EViewerAssetCategories asset_to_bin_map[LLViewerAssetType::AT_COUNT] = -		{ -			LLViewerAssetStats::EVACTextureTempHTTPGet,			// (0) AT_TEXTURE -			LLViewerAssetStats::EVACSoundUDPGet,				// AT_SOUND -			LLViewerAssetStats::EVACOtherGet,					// AT_CALLINGCARD -			LLViewerAssetStats::EVACOtherGet,					// AT_LANDMARK -			LLViewerAssetStats::EVACOtherGet,					// AT_SCRIPT -			LLViewerAssetStats::EVACWearableUDPGet,				// AT_CLOTHING -			LLViewerAssetStats::EVACOtherGet,					// AT_OBJECT -			LLViewerAssetStats::EVACOtherGet,					// AT_NOTECARD -			LLViewerAssetStats::EVACOtherGet,					// AT_CATEGORY -			LLViewerAssetStats::EVACOtherGet,					// AT_ROOT_CATEGORY -			LLViewerAssetStats::EVACOtherGet,					// (10) AT_LSL_TEXT -			LLViewerAssetStats::EVACOtherGet,					// AT_LSL_BYTECODE -			LLViewerAssetStats::EVACOtherGet,					// AT_TEXTURE_TGA -			LLViewerAssetStats::EVACWearableUDPGet,				// AT_BODYPART -			LLViewerAssetStats::EVACOtherGet,					// AT_TRASH -			LLViewerAssetStats::EVACOtherGet,					// AT_SNAPSHOT_CATEGORY -			LLViewerAssetStats::EVACOtherGet,					// AT_LOST_AND_FOUND -			LLViewerAssetStats::EVACSoundUDPGet,				// AT_SOUND_WAV -			LLViewerAssetStats::EVACOtherGet,					// AT_IMAGE_TGA -			LLViewerAssetStats::EVACOtherGet,					// AT_IMAGE_JPEG -			LLViewerAssetStats::EVACGestureUDPGet,				// (20) AT_ANIMATION -			LLViewerAssetStats::EVACGestureUDPGet,				// AT_GESTURE -			LLViewerAssetStats::EVACOtherGet,					// AT_SIMSTATE -			LLViewerAssetStats::EVACOtherGet,					// AT_FAVORITE -			LLViewerAssetStats::EVACOtherGet,					// AT_LINK -			LLViewerAssetStats::EVACOtherGet,					// AT_LINK_FOLDER -			LLViewerAssetStats::EVACOtherGet,					//  -			LLViewerAssetStats::EVACOtherGet,					//  -			LLViewerAssetStats::EVACOtherGet,					//  -			LLViewerAssetStats::EVACOtherGet,					//  -			LLViewerAssetStats::EVACOtherGet,					// (30) -			LLViewerAssetStats::EVACOtherGet,					//  -			LLViewerAssetStats::EVACOtherGet,					//  -			LLViewerAssetStats::EVACOtherGet,					//  -			LLViewerAssetStats::EVACOtherGet,					//  -			LLViewerAssetStats::EVACOtherGet,					//  -			LLViewerAssetStats::EVACOtherGet,					//  -			LLViewerAssetStats::EVACOtherGet,					//  -			LLViewerAssetStats::EVACOtherGet,					//  -			LLViewerAssetStats::EVACOtherGet,					//  -			LLViewerAssetStats::EVACOtherGet,					// (40) -			LLViewerAssetStats::EVACOtherGet,					//  -			LLViewerAssetStats::EVACOtherGet,					//  -			LLViewerAssetStats::EVACOtherGet,					//  -			LLViewerAssetStats::EVACOtherGet,					//  -			LLViewerAssetStats::EVACOtherGet,					// -			LLViewerAssetStats::EVACOtherGet,					//  -			LLViewerAssetStats::EVACOtherGet,					//  -			LLViewerAssetStats::EVACOtherGet,					//  -			LLViewerAssetStats::EVACOtherGet,					// AT_MESH -																// (50) -		}; -	 -	if (at < 0 || at >= LLViewerAssetType::AT_COUNT) -	{ -		return LLViewerAssetStats::EVACOtherGet; -	} -	LLViewerAssetStats::EViewerAssetCategories ret(asset_to_bin_map[at]); -	if (LLViewerAssetStats::EVACTextureTempHTTPGet == ret) -	{ -		// Indexed with [is_temp][with_http] -		static const LLViewerAssetStats::EViewerAssetCategories texture_bin_map[2][2] = -			{ -				{ -					LLViewerAssetStats::EVACTextureNonTempUDPGet, -					LLViewerAssetStats::EVACTextureNonTempHTTPGet, -				}, -				{ -					LLViewerAssetStats::EVACTextureTempUDPGet, -					LLViewerAssetStats::EVACTextureTempHTTPGet, -				} -			}; - -		ret = texture_bin_map[is_temp][with_http]; -	} -	return ret; -} - -} // anonymous namespace diff --git a/indra/newview/llviewerassetstats.h b/indra/newview/llviewerassetstats.h index a750db2cc2..469609ea1f 100755 --- a/indra/newview/llviewerassetstats.h +++ b/indra/newview/llviewerassetstats.h @@ -77,20 +77,6 @@  class LLViewerAssetStats  {  public: -	enum EViewerAssetCategories -	{ -		EVACTextureTempHTTPGet,			//< Texture GETs - temp/baked, HTTP -		EVACTextureTempUDPGet,			//< Texture GETs - temp/baked, UDP -		EVACTextureNonTempHTTPGet,		//< Texture GETs - perm, HTTP -		EVACTextureNonTempUDPGet,		//< Texture GETs - perm, UDP -		EVACWearableUDPGet,				//< Wearable GETs -		EVACSoundUDPGet,				//< Sound GETs -		EVACGestureUDPGet,				//< Gesture GETs -		EVACOtherGet,					//< Other GETs -		 -		EVACCount						// Must be last -	}; -  	/**  	 * Type for duration and other time values in the metrics.  Selected  	 * for compatibility with the pre-existing timestamp on the texture @@ -105,61 +91,6 @@ public:  	 */  	typedef U64 region_handle_t; -	/** -	 * @brief Collected data for a single region visited by the avatar. -	 * -	 * Fairly simple, for each asset bin enumerated above a count -	 * of enqueue and dequeue operations and simple stats on response -	 * times for completed requests. -	 */ -	class PerRegionStats : public LLRefCount -	{ -	public: -		PerRegionStats(const region_handle_t region_handle) -			: LLRefCount(), -			  mRegionHandle(region_handle) -			{ -				reset(); -			} - -		PerRegionStats(const PerRegionStats & src) -			: LLRefCount(), -			  mRegionHandle(src.mRegionHandle), -			  mTotalTime(src.mTotalTime), -			  mStartTimestamp(src.mStartTimestamp), -			  mFPS(src.mFPS) -			{ -				for (int i = 0; i < LL_ARRAY_SIZE(mRequests); ++i) -				{ -					mRequests[i] = src.mRequests[i]; -				} -			} - -		// Default assignment and destructor are correct. -		 -		void reset(); - -		void merge(const PerRegionStats & src); -		 -		// Apply current running time to total and reset start point. -		// Return current timestamp as a convenience. -		void accumulateTime(duration_t now); -		 -	public: -		region_handle_t		mRegionHandle; -		duration_t			mTotalTime; -		duration_t			mStartTimestamp; -		LLSimpleStatMMM<>	mFPS; -		 -		struct prs_group -		{ -			LLSimpleStatCounter			mEnqueued; -			LLSimpleStatCounter			mDequeued; -			LLSimpleStatMMM<duration_t>	mResponse; -		} -		mRequests [EVACCount]; -	}; -  public:  	LLViewerAssetStats();  	LLViewerAssetStats(const LLViewerAssetStats &); @@ -175,26 +106,9 @@ public:  	// collection calls.  	void setRegion(region_handle_t region_handle); -	// Asset GET Requests -	void recordGetEnqueued(LLViewerAssetType::EType at, bool with_http, bool is_temp); -	void recordGetDequeued(LLViewerAssetType::EType at, bool with_http, bool is_temp); -	void recordGetServiced(LLViewerAssetType::EType at, bool with_http, bool is_temp, duration_t duration); - -	// Frames-Per-Second Samples -	void recordFPS(F32 fps); -  	// Avatar-related statistics  	void recordAvatarStats(); -	// Merge a source instance into a destination instance.  This is -	// conceptually an 'operator+=()' method: -	// - counts are added -	// - minimums are min'd -	// - maximums are max'd -	// - other scalars are ignored ('this' wins) -	// -	void merge(const LLViewerAssetStats & src); -	  	// Retrieve current metrics for all visited regions (NULL region UUID/handle excluded)      // Returned LLSD is structured as follows:  	// @@ -240,7 +154,6 @@ public:  	LLSD asLLSD(bool compact_output);  protected: -	typedef std::map<region_handle_t, LLPointer<PerRegionStats> > PerRegionContainer;  	typedef std::map<region_handle_t, LLTrace::Recording > PerRegionRecordingContainer;  	// Region of the currently-active region.  Always valid but may @@ -248,22 +161,12 @@ protected:  	// by a reset() call.  	region_handle_t mRegionHandle; -	// Pointer to metrics collection for currently-active region.  Always -	// valid and unchanged after reset() though contents will be changed. -	// Always points to a collection contained in mRegionStats. -	LLPointer<PerRegionStats> mCurRegionStats; - -	static LLTrace::Count<> sEnqueued[EVACCount]; -	static LLTrace::Count<> sDequeued[EVACCount]; -	static LLTrace::Measurement<LLTrace::Seconds> sResponse[EVACCount]; +	// Pointer to metrics collection for currently-active region.   +	LLTrace::Recording*			mCurRecording;  	// Metrics data for all regions during one collection cycle -	PerRegionContainer mRegionStats;  	PerRegionRecordingContainer mRegionRecordings; -	// Time of last reset -	duration_t mResetTimestamp; -  	// Nearby avatar stats  	std::vector<S32> mAvatarRezStates;  	LLViewerStats::phase_stats_t mPhaseStats; @@ -284,12 +187,24 @@ protected:   *  - Main:  main() program execution thread   *  - Thread1:  TextureFetch worker thread   */ -extern LLViewerAssetStats * gViewerAssetStatsMain; - -extern LLViewerAssetStats * gViewerAssetStatsThread1; +extern LLViewerAssetStats * gViewerAssetStats;  namespace LLViewerAssetStatsFF  { +	enum EViewerAssetCategories +	{ +		EVACTextureTempHTTPGet,			//< Texture GETs - temp/baked, HTTP +		EVACTextureTempUDPGet,			//< Texture GETs - temp/baked, UDP +		EVACTextureNonTempHTTPGet,		//< Texture GETs - perm, HTTP +		EVACTextureNonTempUDPGet,		//< Texture GETs - perm, UDP +		EVACWearableUDPGet,				//< Wearable GETs +		EVACSoundUDPGet,				//< Sound GETs +		EVACGestureUDPGet,				//< Gesture GETs +		EVACOtherGet,					//< Other GETs + +		EVACCount						// Must be last +	}; +  /**   * @brief Allocation and deallocation of globals.   * @@ -314,31 +229,17 @@ inline LLViewerAssetStats::duration_t get_timestamp()  /**   * Region context, event and duration loggers for the Main thread.   */ -void set_region_main(LLViewerAssetStats::region_handle_t region_handle); +void set_region(LLViewerAssetStats::region_handle_t region_handle); -void record_enqueue_main(LLViewerAssetType::EType at, bool with_http, bool is_temp); +void record_enqueue(LLViewerAssetType::EType at, bool with_http, bool is_temp); -void record_dequeue_main(LLViewerAssetType::EType at, bool with_http, bool is_temp); +void record_dequeue(LLViewerAssetType::EType at, bool with_http, bool is_temp); -void record_response_main(LLViewerAssetType::EType at, bool with_http, bool is_temp, +void record_response(LLViewerAssetType::EType at, bool with_http, bool is_temp,  						  LLViewerAssetStats::duration_t duration); -void record_fps_main(F32 fps); -  void record_avatar_stats(); -/** - * Region context, event and duration loggers for Thread 1. - */ -void set_region_thread1(LLViewerAssetStats::region_handle_t region_handle); - -void record_enqueue_thread1(LLViewerAssetType::EType at, bool with_http, bool is_temp); - -void record_dequeue_thread1(LLViewerAssetType::EType at, bool with_http, bool is_temp); - -void record_response_thread1(LLViewerAssetType::EType at, bool with_http, bool is_temp, -						  LLViewerAssetStats::duration_t duration); -  } // namespace LLViewerAssetStatsFF  #endif // LL_LLVIEWERASSETSTATUS_H diff --git a/indra/newview/llviewerassetstorage.cpp b/indra/newview/llviewerassetstorage.cpp index d042f62830..6f41abbd8a 100644 --- a/indra/newview/llviewerassetstorage.cpp +++ b/indra/newview/llviewerassetstorage.cpp @@ -73,8 +73,8 @@ protected:  			{  				// Okay, it appears this request was used for useful things.  Record  				// the expected dequeue and duration of request processing. -				LLViewerAssetStatsFF::record_dequeue_main(mType, false, false); -				LLViewerAssetStatsFF::record_response_main(mType, false, false, +				LLViewerAssetStatsFF::record_dequeue(mType, false, false); +				LLViewerAssetStatsFF::record_response(mType, false, false,  														   (LLViewerAssetStatsFF::get_timestamp()  															- mMetricsStartTime));  				mMetricsStartTime = 0; @@ -373,7 +373,7 @@ void LLViewerAssetStorage::_queueDataRequest(  			LLTransferTargetChannel *ttcp = gTransferManager.getTargetChannel(mUpstreamHost, LLTCT_ASSET);  			ttcp->requestTransfer(spa, tpvf, 100.f + (is_priority ? 1.f : 0.f)); -			LLViewerAssetStatsFF::record_enqueue_main(atype, false, false); +			LLViewerAssetStatsFF::record_enqueue(atype, false, false);  		}  	}  	else diff --git a/indra/newview/tests/llviewerassetstats_test.cpp b/indra/newview/tests/llviewerassetstats_test.cpp index 4a190fbe23..e0126ce8d3 100755 --- a/indra/newview/tests/llviewerassetstats_test.cpp +++ b/indra/newview/tests/llviewerassetstats_test.cpp @@ -243,11 +243,11 @@ namespace tut  		// Check that helpers aren't bothered by missing global stats  		ensure("Global gViewerAssetStatsMain should be NULL", (NULL == gViewerAssetStatsMain)); -		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_TEXTURE, false, false); +		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_TEXTURE, false, false); -		LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_TEXTURE, false, false); +		LLViewerAssetStatsFF::record_dequeue(LLViewerAssetType::AT_TEXTURE, false, false); -		LLViewerAssetStatsFF::record_response_main(LLViewerAssetType::AT_GESTURE, false, false, 12300000ULL); +		LLViewerAssetStatsFF::record_response(LLViewerAssetType::AT_GESTURE, false, false, 12300000ULL);  	}  	// Create a non-global instance and check the structure @@ -326,13 +326,13 @@ namespace tut  	void tst_viewerassetstats_index_object_t::test<4>()  	{  		gViewerAssetStatsMain = new LLViewerAssetStats(); -		LLViewerAssetStatsFF::set_region_main(region1_handle); +		LLViewerAssetStatsFF::set_region(region1_handle); -		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_TEXTURE, false, false); -		LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_TEXTURE, false, false); +		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_TEXTURE, false, false); +		LLViewerAssetStatsFF::record_dequeue(LLViewerAssetType::AT_TEXTURE, false, false); -		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_BODYPART, false, false); -		LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_BODYPART, false, false); +		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_BODYPART, false, false); +		LLViewerAssetStatsFF::record_dequeue(LLViewerAssetType::AT_BODYPART, false, false);  		LLSD sd = gViewerAssetStatsMain->asLLSD(false);  		ensure("Correct single-key LLSD map root", is_triple_key_map(sd, "regions", "duration", "avatar")); @@ -364,13 +364,13 @@ namespace tut  	{  		gViewerAssetStatsThread1 = new LLViewerAssetStats();  		gViewerAssetStatsMain = new LLViewerAssetStats(); -		LLViewerAssetStatsFF::set_region_main(region1_handle); +		LLViewerAssetStatsFF::set_region(region1_handle); -		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_TEXTURE, false, false); -		LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_TEXTURE, false, false); +		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_TEXTURE, false, false); +		LLViewerAssetStatsFF::record_dequeue(LLViewerAssetType::AT_TEXTURE, false, false); -		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_BODYPART, false, false); -		LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_BODYPART, false, false); +		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_BODYPART, false, false); +		LLViewerAssetStatsFF::record_dequeue(LLViewerAssetType::AT_BODYPART, false, false);  		LLSD sd = gViewerAssetStatsThread1->asLLSD(false);  		ensure("Other collector is empty", is_no_stats_map(sd)); @@ -393,8 +393,6 @@ namespace tut  		delete gViewerAssetStatsMain;  		gViewerAssetStatsMain = NULL; -		delete gViewerAssetStatsThread1; -		gViewerAssetStatsThread1 = NULL;  		ensure("sd[get_texture_non_temp_udp][enqueued] is reset", (0 == sd["get_texture_non_temp_udp"]["enqueued"].asInteger()));  		ensure("sd[get_gesture_udp][dequeued] is reset", (0 == sd["get_gesture_udp"]["dequeued"].asInteger())); @@ -406,20 +404,20 @@ namespace tut  	{  		gViewerAssetStatsMain = new LLViewerAssetStats(); -		LLViewerAssetStatsFF::set_region_main(region1_handle); +		LLViewerAssetStatsFF::set_region(region1_handle); -		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_TEXTURE, false, false); -		LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_TEXTURE, false, false); +		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_TEXTURE, false, false); +		LLViewerAssetStatsFF::record_dequeue(LLViewerAssetType::AT_TEXTURE, false, false); -		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_BODYPART, false, false); -		LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_BODYPART, false, false); +		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_BODYPART, false, false); +		LLViewerAssetStatsFF::record_dequeue(LLViewerAssetType::AT_BODYPART, false, false); -		LLViewerAssetStatsFF::set_region_main(region2_handle); +		LLViewerAssetStatsFF::set_region(region2_handle); -		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_GESTURE, false, false); -		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_GESTURE, false, false); -		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_GESTURE, false, false); -		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_GESTURE, false, false); +		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_GESTURE, false, false); +		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_GESTURE, false, false); +		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_GESTURE, false, false); +		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_GESTURE, false, false);  		LLSD sd = gViewerAssetStatsMain->asLLSD(false); @@ -465,35 +463,35 @@ namespace tut  	{  		gViewerAssetStatsMain = new LLViewerAssetStats(); -		LLViewerAssetStatsFF::set_region_main(region1_handle); +		LLViewerAssetStatsFF::set_region(region1_handle); -		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_TEXTURE, false, false); -		LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_TEXTURE, false, false); +		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_TEXTURE, false, false); +		LLViewerAssetStatsFF::record_dequeue(LLViewerAssetType::AT_TEXTURE, false, false); -		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_BODYPART, false, false); -		LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_BODYPART, false, false); +		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_BODYPART, false, false); +		LLViewerAssetStatsFF::record_dequeue(LLViewerAssetType::AT_BODYPART, false, false); -		LLViewerAssetStatsFF::set_region_main(region2_handle); +		LLViewerAssetStatsFF::set_region(region2_handle); -		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_GESTURE, false, false); -		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_GESTURE, false, false); -		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_GESTURE, false, false); -		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_GESTURE, false, false); +		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_GESTURE, false, false); +		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_GESTURE, false, false); +		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_GESTURE, false, false); +		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_GESTURE, false, false); -		LLViewerAssetStatsFF::set_region_main(region1_handle); +		LLViewerAssetStatsFF::set_region(region1_handle); -		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_TEXTURE, true, true); -		LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_TEXTURE, true, true); +		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_TEXTURE, true, true); +		LLViewerAssetStatsFF::record_dequeue(LLViewerAssetType::AT_TEXTURE, true, true); -		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_BODYPART, false, false); -		LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_BODYPART, false, false); +		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_BODYPART, false, false); +		LLViewerAssetStatsFF::record_dequeue(LLViewerAssetType::AT_BODYPART, false, false); -		LLViewerAssetStatsFF::set_region_main(region2_handle); +		LLViewerAssetStatsFF::set_region(region2_handle); -		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_GESTURE, false, false); -		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_GESTURE, false, false); -		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_GESTURE, false, false); -		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_GESTURE, false, false); +		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_GESTURE, false, false); +		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_GESTURE, false, false); +		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_GESTURE, false, false); +		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_GESTURE, false, false);  		LLSD sd = gViewerAssetStatsMain->asLLSD(false); @@ -538,30 +536,30 @@ namespace tut  	{  		gViewerAssetStatsThread1 = new LLViewerAssetStats();  		gViewerAssetStatsMain = new LLViewerAssetStats(); -		LLViewerAssetStatsFF::set_region_main(region1_handle); +		LLViewerAssetStatsFF::set_region(region1_handle); -		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_TEXTURE, false, false); -		LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_TEXTURE, false, false); +		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_TEXTURE, false, false); +		LLViewerAssetStatsFF::record_dequeue(LLViewerAssetType::AT_TEXTURE, false, false); -		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_BODYPART, false, false); -		LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_BODYPART, false, false); +		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_BODYPART, false, false); +		LLViewerAssetStatsFF::record_dequeue(LLViewerAssetType::AT_BODYPART, false, false); -		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_BODYPART, false, true); -		LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_BODYPART, false, true); +		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_BODYPART, false, true); +		LLViewerAssetStatsFF::record_dequeue(LLViewerAssetType::AT_BODYPART, false, true); -		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_BODYPART, true, false); -		LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_BODYPART, true, false); +		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_BODYPART, true, false); +		LLViewerAssetStatsFF::record_dequeue(LLViewerAssetType::AT_BODYPART, true, false); -		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_BODYPART, true, true); -		LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_BODYPART, true, true); +		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_BODYPART, true, true); +		LLViewerAssetStatsFF::record_dequeue(LLViewerAssetType::AT_BODYPART, true, true); -		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_LSL_BYTECODE, false, false); +		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_LSL_BYTECODE, false, false); -		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_LSL_BYTECODE, false, true); +		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_LSL_BYTECODE, false, true); -		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_LSL_BYTECODE, true, false); +		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_LSL_BYTECODE, true, false); -		LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_LSL_BYTECODE, true, true); +		LLViewerAssetStatsFF::record_enqueue(LLViewerAssetType::AT_LSL_BYTECODE, true, true);  		LLSD sd = gViewerAssetStatsThread1->asLLSD(false);  		ensure("Other collector is empty", is_no_stats_map(sd)); | 
