diff options
-rw-r--r-- | indra/llmessage/llcurl.cpp | 1 | ||||
-rwxr-xr-x | indra/newview/llagent.cpp | 4 | ||||
-rwxr-xr-x | indra/newview/llagentwearables.cpp | 2 | ||||
-rw-r--r-- | indra/newview/llagentwearablesfetch.cpp | 4 | ||||
-rw-r--r-- | indra/newview/llappearancemgr.cpp | 9 | ||||
-rwxr-xr-x[-rw-r--r--] | indra/newview/llstartup.cpp | 4 | ||||
-rwxr-xr-x[-rw-r--r--] | indra/newview/llstartup.h | 4 | ||||
-rwxr-xr-x | indra/newview/llviewerassetstats.cpp | 4 | ||||
-rwxr-xr-x | indra/newview/llviewerassetstats.h | 2 | ||||
-rwxr-xr-x[-rw-r--r--] | indra/newview/llviewerstats.cpp | 107 | ||||
-rwxr-xr-x | indra/newview/llviewerstats.h | 23 | ||||
-rwxr-xr-x | indra/newview/llvoavatar.cpp | 111 | ||||
-rwxr-xr-x | indra/newview/llvoavatar.h | 50 | ||||
-rwxr-xr-x | indra/newview/llvoavatarself.cpp | 13 | ||||
-rwxr-xr-x | indra/newview/tests/llviewerassetstats_test.cpp | 13 |
15 files changed, 194 insertions, 157 deletions
diff --git a/indra/llmessage/llcurl.cpp b/indra/llmessage/llcurl.cpp index f58a4f5caf..4d92cfd32f 100644 --- a/indra/llmessage/llcurl.cpp +++ b/indra/llmessage/llcurl.cpp @@ -1506,6 +1506,7 @@ void LLCurl::cleanupClass() delete sHandleMutexp ; sHandleMutexp = NULL ; + // removed as per https://jira.secondlife.com/browse/SH-3115 //llassert(Easy::sActiveHandles.empty()); } diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index b1ece51439..5f07501983 100755 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -3785,8 +3785,8 @@ void LLAgent::sendAgentSetAppearance() if (!gAgentWearables.changeInProgress()) { // Change is fully resolved, can close some open phases. - gAgentAvatarp->stopPhase("process_initial_wearables_update"); - gAgentAvatarp->stopPhase("wear_inventory_category"); + gAgentAvatarp->getPhases().stopPhase("process_initial_wearables_update"); + gAgentAvatarp->getPhases().stopPhase("wear_inventory_category"); } gAgentAvatarp->sendAppearanceChangeMetrics(); diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index 5bfcace707..0104d2b088 100755 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -953,7 +953,7 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs if (isAgentAvatarValid()) { //gAgentAvatarp->clearPhases(); // reset phase timers for outfit loading. - gAgentAvatarp->startPhase("process_initial_wearables_update"); + gAgentAvatarp->getPhases().startPhase("process_initial_wearables_update"); gAgentAvatarp->outputRezTiming("Received initial wearables update"); } diff --git a/indra/newview/llagentwearablesfetch.cpp b/indra/newview/llagentwearablesfetch.cpp index 2735c7ef39..e2417cdddb 100644 --- a/indra/newview/llagentwearablesfetch.cpp +++ b/indra/newview/llagentwearablesfetch.cpp @@ -89,7 +89,7 @@ LLInitialWearablesFetch::LLInitialWearablesFetch(const LLUUID& cof_id) : { if (isAgentAvatarValid()) { - gAgentAvatarp->startPhase("initial_wearables_fetch"); + gAgentAvatarp->getPhases().startPhase("initial_wearables_fetch"); gAgentAvatarp->outputRezTiming("Initial wearables fetch started"); } } @@ -108,7 +108,7 @@ void LLInitialWearablesFetch::done() doOnIdleOneTime(boost::bind(&LLInitialWearablesFetch::processContents,this)); if (isAgentAvatarValid()) { - gAgentAvatarp->stopPhase("initial_wearables_fetch"); + gAgentAvatarp->getPhases().stopPhase("initial_wearables_fetch"); gAgentAvatarp->outputRezTiming("Initial wearables fetch done"); } } diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 11f6aa1013..73dd64dffe 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -162,6 +162,8 @@ public: mCatID = cat_id; mAppend = append; + LL_DEBUGS("Avatar") << self_av_string() << "starting" << LL_ENDL; + selfStartPhase("wear_inventory_category_callback"); } void fire(const LLUUID& item_id) @@ -174,7 +176,7 @@ public: * after the last item has fired the event and dereferenced it -- if all * the events actually fire! */ - selfStopPhase("wear_inventory_category_callback"); + LL_DEBUGS("Avatar") << self_av_string() << " fired on copied item, id " << item_id << LL_ENDL; } protected: @@ -182,6 +184,8 @@ protected: { LL_DEBUGS("Avatar") << self_av_string() << "done all inventory callbacks" << LL_ENDL; + selfStopPhase("wear_inventory_category_callback"); + // Is the destructor called by ordinary dereference, or because the app's shutting down? // If the inventory callback manager goes away, we're shutting down, no longer want the callback. if( LLInventoryCallbackManager::is_instantiated() ) @@ -1891,6 +1895,7 @@ void LLAppearanceMgr::wearInventoryCategory(LLInventoryCategory* category, bool LL_DEBUGS("Avatar") << self_av_string() << "wearInventoryCategory( " << category->getName() << " )" << LL_ENDL; + selfStartPhase("wear_inventory_category_fetch"); callAfterCategoryFetch(category->getUUID(),boost::bind(&LLAppearanceMgr::wearCategoryFinal, &LLAppearanceMgr::instance(), category->getUUID(), copy, append)); @@ -1899,6 +1904,8 @@ void LLAppearanceMgr::wearInventoryCategory(LLInventoryCategory* category, bool void LLAppearanceMgr::wearCategoryFinal(LLUUID& cat_id, bool copy_items, bool append) { LL_DEBUGS("Avatar") << self_av_string() << "starting" << LL_ENDL; + + selfStopPhase("wear_inventory_category_fetch"); // We now have an outfit ready to be copied to agent inventory. Do // it, and wear that outfit normally. diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 3923b4510a..8586900b9c 100644..100755 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -240,6 +240,7 @@ static bool mLoginStatePastUI = false; boost::scoped_ptr<LLEventPump> LLStartUp::sStateWatcher(new LLEventStream("StartupState")); boost::scoped_ptr<LLStartupListener> LLStartUp::sListener(new LLStartupListener()); +boost::scoped_ptr<LLViewerStats::PhaseMap> LLStartUp::sPhases(new LLViewerStats::PhaseMap); // // local function declaration @@ -2706,7 +2707,10 @@ void LLStartUp::setStartupState( EStartupState state ) LL_INFOS("AppInit") << "Startup state changing from " << getStartupStateString() << " to " << startupStateToString(state) << LL_ENDL; + + sPhases->stopPhase(getStartupStateString()); gStartupState = state; + sPhases->startPhase(getStartupStateString()); postStartupState(); } diff --git a/indra/newview/llstartup.h b/indra/newview/llstartup.h index 0a18ef1b2d..3754aaf966 100644..100755 --- a/indra/newview/llstartup.h +++ b/indra/newview/llstartup.h @@ -34,6 +34,8 @@ class LLEventPump; class LLStartupListener; class LLSLURL; +#include "llviewerstats.h" + // functions bool idle_startup(); void release_start_screen(); @@ -113,6 +115,7 @@ public: static bool startLLProxy(); // Initialize the SOCKS 5 proxy + static LLViewerStats::PhaseMap& getPhases() { return *sPhases; } private: static LLSLURL sStartSLURL; @@ -120,6 +123,7 @@ private: static EStartupState gStartupState; // Do not set directly, use LLStartup::setStartupState static boost::scoped_ptr<LLEventPump> sStateWatcher; static boost::scoped_ptr<LLStartupListener> sListener; + static boost::scoped_ptr<LLViewerStats::PhaseMap> sPhases; }; diff --git a/indra/newview/llviewerassetstats.cpp b/indra/newview/llviewerassetstats.cpp index f408d06f4c..4c59fd0371 100755 --- a/indra/newview/llviewerassetstats.cpp +++ b/indra/newview/llviewerassetstats.cpp @@ -265,8 +265,8 @@ LLViewerAssetStats::recordAvatarStats() LLVOAvatar::getNearbyRezzedStats(rez_counts); mAvatarRezStates = rez_counts; mPhaseStats.clear(); - mPhaseStats["cloud"] = LLVOAvatar::getPhaseStats("cloud"); - mPhaseStats["cloud-or-gray"] = LLVOAvatar::getPhaseStats("cloud-or-gray"); + mPhaseStats["cloud"] = LLViewerStats::PhaseMap::getPhaseStats("cloud"); + mPhaseStats["cloud-or-gray"] = LLViewerStats::PhaseMap::getPhaseStats("cloud-or-gray"); } LLSD diff --git a/indra/newview/llviewerassetstats.h b/indra/newview/llviewerassetstats.h index 4b278bc2a2..8319752230 100755 --- a/indra/newview/llviewerassetstats.h +++ b/indra/newview/llviewerassetstats.h @@ -259,7 +259,7 @@ protected: // Nearby avatar stats std::vector<S32> mAvatarRezStates; - LLVOAvatar::phase_stats_t mPhaseStats; + LLViewerStats::phase_stats_t mPhaseStats; }; diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index c88122f22c..497e95c5e3 100644..100755 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -860,3 +860,110 @@ void send_stats() LLHTTPClient::post(url, body, new ViewerStatsResponder()); } +LLFrameTimer& LLViewerStats::PhaseMap::getPhaseTimer(const std::string& phase_name) +{ + phase_map_t::iterator iter = mPhaseMap.find(phase_name); + if (iter == mPhaseMap.end()) + { + LLFrameTimer timer; + mPhaseMap[phase_name] = timer; + } + LLFrameTimer& timer = mPhaseMap[phase_name]; + return timer; +} + +void LLViewerStats::PhaseMap::startPhase(const std::string& phase_name) +{ + LLFrameTimer& timer = getPhaseTimer(phase_name); + lldebugs << "startPhase " << phase_name << llendl; + timer.unpause(); +} + +void LLViewerStats::PhaseMap::stopPhase(const std::string& phase_name) +{ + phase_map_t::iterator iter = mPhaseMap.find(phase_name); + if (iter != mPhaseMap.end()) + { + if (iter->second.getStarted()) + { + // Going from started to paused state - record stats. + recordPhaseStat(phase_name,iter->second.getElapsedTimeF32()); + } + lldebugs << "stopPhase " << phase_name << llendl; + iter->second.pause(); + } + else + { + lldebugs << "stopPhase " << phase_name << " is not started, no-op" << llendl; + } +} + +void LLViewerStats::PhaseMap::stopAllPhases() +{ + for (phase_map_t::iterator iter = mPhaseMap.begin(); + iter != mPhaseMap.end(); ++iter) + { + const std::string& phase_name = iter->first; + if (iter->second.getStarted()) + { + // Going from started to paused state - record stats. + recordPhaseStat(phase_name,iter->second.getElapsedTimeF32()); + } + lldebugs << "stopPhase (all) " << phase_name << llendl; + iter->second.pause(); + } +} + +void LLViewerStats::PhaseMap::clearPhases() +{ + lldebugs << "clearPhases" << llendl; + + mPhaseMap.clear(); +} + +LLSD LLViewerStats::PhaseMap::dumpPhases() +{ + LLSD result; + for (phase_map_t::iterator iter = mPhaseMap.begin(); iter != mPhaseMap.end(); ++iter) + { + const std::string& phase_name = iter->first; + result[phase_name]["completed"] = !(iter->second.getStarted()); + result[phase_name]["elapsed"] = iter->second.getElapsedTimeF32(); +#if 0 // global stats for each phase seem like overkill here + phase_stats_t::iterator stats_iter = sPhaseStats.find(phase_name); + if (stats_iter != sPhaseStats.end()) + { + result[phase_name]["stats"] = stats_iter->second.getData(); + } +#endif + } + return result; +} + +// static initializer +//static +LLViewerStats::phase_stats_t LLViewerStats::PhaseMap::sStats; + +LLViewerStats::PhaseMap::PhaseMap() +{ +} + +// static +LLViewerStats::StatsAccumulator& LLViewerStats::PhaseMap::getPhaseStats(const std::string& phase_name) +{ + phase_stats_t::iterator it = sStats.find(phase_name); + if (it == sStats.end()) + { + LLViewerStats::StatsAccumulator new_stats; + sStats[phase_name] = new_stats; + } + return sStats[phase_name]; +} + +// static +void LLViewerStats::PhaseMap::recordPhaseStat(const std::string& phase_name, F32 value) +{ + LLViewerStats::StatsAccumulator& stats = getPhaseStats(phase_name); + stats.push(value); +} + diff --git a/indra/newview/llviewerstats.h b/indra/newview/llviewerstats.h index 718fabc75a..750d963f69 100755 --- a/indra/newview/llviewerstats.h +++ b/indra/newview/llviewerstats.h @@ -274,7 +274,28 @@ public: }; StatsAccumulator mAgentPositionSnaps; - + + // Phase tracking (originally put in for avatar rezzing), tracking + // progress of active/completed phases for activities like outfit changing. + typedef std::map<std::string,LLFrameTimer> phase_map_t; + typedef std::map<std::string,StatsAccumulator> phase_stats_t; + class PhaseMap + { + private: + phase_map_t mPhaseMap; + static phase_stats_t sStats; + public: + PhaseMap(); + LLFrameTimer& getPhaseTimer(const std::string& phase_name); + void startPhase(const std::string& phase_name); + void stopPhase(const std::string& phase_name); + void stopAllPhases(); + void clearPhases(); + LLSD dumpPhases(); + static StatsAccumulator& getPhaseStats(const std::string& phase_name); + static void recordPhaseStat(const std::string& phase_name, F32 value); + }; + private: F64 mStats[ST_COUNT]; diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 46805ec0c6..275c326ef6 100755 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -637,7 +637,6 @@ F32 LLVOAvatar::sUnbakedTime = 0.f; F32 LLVOAvatar::sUnbakedUpdateTime = 0.f; F32 LLVOAvatar::sGreyTime = 0.f; F32 LLVOAvatar::sGreyUpdateTime = 0.f; -LLVOAvatar::phase_stats_t LLVOAvatar::sPhaseStats; //----------------------------------------------------------------------------- // Helper functions @@ -867,7 +866,7 @@ LLVOAvatar::~LLVOAvatar() mAnimationSources.clear(); LLLoadedCallbackEntry::cleanUpCallbackList(&mCallbackTextureList) ; - clearPhases(); + getPhases().clearPhases(); lldebugs << "LLVOAvatar Destructor end" << llendl; } @@ -951,106 +950,6 @@ S32 LLVOAvatar::getRezzedStatus() const return 1; // gray } -LLFrameTimer& LLVOAvatar::getPhaseTimer(const std::string& phase_name) -{ - phase_map_t::iterator iter = mPhases.find(phase_name); - if (iter == mPhases.end()) - { - LLFrameTimer timer; - mPhases[phase_name] = timer; - } - LLFrameTimer& timer = mPhases[phase_name]; - return timer; -} - -void LLVOAvatar::startPhase(const std::string& phase_name) -{ - LLFrameTimer& timer = getPhaseTimer(phase_name); - lldebugs << "startPhase " << phase_name << llendl; - timer.unpause(); -} - -void LLVOAvatar::stopPhase(const std::string& phase_name) -{ - phase_map_t::iterator iter = mPhases.find(phase_name); - if (iter != mPhases.end()) - { - if (iter->second.getStarted()) - { - // Going from started to paused state - record stats. - recordPhaseStat(phase_name,iter->second.getElapsedTimeF32()); - } - lldebugs << "stopPhase " << phase_name << llendl; - iter->second.pause(); - } - else - { - lldebugs << "stopPhase " << phase_name << " is not started, no-op" << llendl; - } -} - -void LLVOAvatar::stopAllPhases() -{ - for (phase_map_t::iterator iter = mPhases.begin(); - iter != mPhases.end(); ++iter) - { - const std::string& phase_name = iter->first; - if (iter->second.getStarted()) - { - // Going from started to paused state - record stats. - recordPhaseStat(phase_name,iter->second.getElapsedTimeF32()); - } - lldebugs << "stopPhase (all) " << phase_name << llendl; - iter->second.pause(); - } -} - -void LLVOAvatar::clearPhases() -{ - lldebugs << "clearPhases" << llendl; - - mPhases.clear(); - mLastRezzedStatus = -1; -} - -LLSD LLVOAvatar::dumpPhases() -{ - LLSD result; - for (phase_map_t::iterator iter = mPhases.begin(); iter != mPhases.end(); ++iter) - { - const std::string& phase_name = iter->first; - result[phase_name]["completed"] = !(iter->second.getStarted()); - result[phase_name]["elapsed"] = iter->second.getElapsedTimeF32(); -#if 0 // global stats for each phase seem like overkill here - phase_stats_t::iterator stats_iter = sPhaseStats.find(phase_name); - if (stats_iter != sPhaseStats.end()) - { - result[phase_name]["stats"] = stats_iter->second.getData(); - } -#endif - } - return result; -} - -// static -LLViewerStats::StatsAccumulator& LLVOAvatar::getPhaseStats(const std::string& phase_name) -{ - phase_stats_t::iterator it = sPhaseStats.find(phase_name); - if (it == sPhaseStats.end()) - { - LLViewerStats::StatsAccumulator new_stats; - sPhaseStats[phase_name] = new_stats; - } - return sPhaseStats[phase_name]; -} - -// static -void LLVOAvatar::recordPhaseStat(const std::string& phase_name, F32 value) -{ - LLViewerStats::StatsAccumulator& stats = getPhaseStats(phase_name); - stats.push(value); -} - void LLVOAvatar::deleteLayerSetCaches(bool clearAll) { for (U32 i = 0; i < mBakedTextureDatas.size(); i++) @@ -6605,24 +6504,24 @@ void LLVOAvatar::updateRezzedStatusTimers() if (is_cloud && !was_cloud) { // start cloud timer. - startPhase("cloud"); + getPhases().startPhase("cloud"); } else if (was_cloud && !is_cloud) { // stop cloud timer, which will capture stats. - stopPhase("cloud"); + getPhases().stopPhase("cloud"); } // Non-cloud-or-gray to cloud-or-gray if (is_cloud_or_gray && !was_cloud_or_gray) { // start cloud-or-gray timer. - startPhase("cloud-or-gray"); + getPhases().startPhase("cloud-or-gray"); } else if (was_cloud_or_gray && !is_cloud_or_gray) { // stop cloud-or-gray timer, which will capture stats. - stopPhase("cloud-or-gray"); + getPhases().stopPhase("cloud-or-gray"); } mLastRezzedStatus = rez_status; diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 8b72682040..6334c43f8e 100755 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -287,32 +287,10 @@ public: S32 mLastRezzedStatus; - // Tracking progress of active/completed phases for activities like outfit changing. - LLFrameTimer& getPhaseTimer(const std::string& phase_name); - void startPhase(const std::string& phase_name); - void stopPhase(const std::string& phase_name); - void stopAllPhases(); - void clearPhases(); - LLSD dumpPhases(); - static LLViewerStats::StatsAccumulator& getPhaseStats(const std::string& phase_name); - static void recordPhaseStat(const std::string& phase_name, F32 value); - - class ScopedPhaseSetter + LLViewerStats::PhaseMap& getPhases() { - public: - ScopedPhaseSetter(LLVOAvatar* avatar, std::string phase_name): - mAvatar(avatar),mPhaseName(phase_name) - { - if (mAvatar) { mAvatar->startPhase(mPhaseName); } - } - ~ScopedPhaseSetter() - { - if (mAvatar) { mAvatar->stopPhase(mPhaseName); } - } - private: - std::string mPhaseName; - LLVOAvatar* mAvatar; - }; + return mPhases; + } protected: BOOL updateIsFullyLoaded(); @@ -329,14 +307,26 @@ private: LLFrameTimer mFullyLoadedTimer; LLFrameTimer mRuthTimer; - // TODO move all the phase stuff to its down data structure. public: - typedef std::map<std::string,LLViewerStats::StatsAccumulator> phase_stats_t; - typedef std::map<std::string,LLFrameTimer> phase_map_t; + class ScopedPhaseSetter + { + public: + ScopedPhaseSetter(LLVOAvatar *avatarp, std::string phase_name): + mAvatar(avatarp), mPhaseName(phase_name) + { + if (mAvatar) { mAvatar->getPhases().startPhase(mPhaseName); } + } + ~ScopedPhaseSetter() + { + if (mAvatar) { mAvatar->getPhases().stopPhase(mPhaseName); } + } + private: + std::string mPhaseName; + LLVOAvatar* mAvatar; + }; private: - phase_map_t mPhases; - static phase_stats_t sPhaseStats; + LLViewerStats::PhaseMap mPhases; protected: LLFrameTimer mInvisibleTimer; diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 66cc107a87..14d5b1c8d9 100755 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -59,6 +59,7 @@ #include "llmeshrepository.h" #include "llvovolume.h" #include "llsdutil.h" +#include "llstartup.h" #if LL_MSVC // disable boost::lexical_cast warning @@ -80,7 +81,7 @@ void selfStartPhase(const std::string& phase_name) { if (isAgentAvatarValid()) { - gAgentAvatarp->startPhase(phase_name); + gAgentAvatarp->getPhases().startPhase(phase_name); } } @@ -88,7 +89,7 @@ void selfStopPhase(const std::string& phase_name) { if (isAgentAvatarValid()) { - gAgentAvatarp->stopPhase(phase_name); + gAgentAvatarp->getPhases().stopPhase(phase_name); } } @@ -96,7 +97,8 @@ void selfClearPhases() { if (isAgentAvatarValid()) { - gAgentAvatarp->clearPhases(); + gAgentAvatarp->getPhases().clearPhases(); + gAgentAvatarp->mLastRezzedStatus = -1; } } @@ -104,7 +106,7 @@ void selfStopAllPhases() { if (isAgentAvatarValid()) { - gAgentAvatarp->stopAllPhases(); + gAgentAvatarp->getPhases().stopAllPhases(); } } @@ -2146,7 +2148,8 @@ LLSD LLVOAvatarSelf::metricsData() result["timers"]["ruth"] = mRuthTimer.getElapsedTimeF32(); result["timers"]["invisible"] = mInvisibleTimer.getElapsedTimeF32(); result["timers"]["fully_loaded"] = mFullyLoadedTimer.getElapsedTimeF32(); - result["phases"] = dumpPhases(); + result["phases"] = getPhases().dumpPhases(); + result["startup"] = LLStartUp::getPhases().dumpPhases(); return result; } diff --git a/indra/newview/tests/llviewerassetstats_test.cpp b/indra/newview/tests/llviewerassetstats_test.cpp index 952f0f1a6e..f8923b9868 100755 --- a/indra/newview/tests/llviewerassetstats_test.cpp +++ b/indra/newview/tests/llviewerassetstats_test.cpp @@ -45,12 +45,6 @@ void LLVOAvatar::getNearbyRezzedStats(std::vector<S32>& counts) counts[2] = 1; } -LLViewerStats::StatsAccumulator& LLVOAvatar::getPhaseStats(const std::string& phase_name) -{ - static std::map<std::string,LLViewerStats::StatsAccumulator> stats_map; - return stats_map[phase_name]; -} - // static std::string LLVOAvatar::rezStatusToString(S32 rez_status) { @@ -60,6 +54,13 @@ std::string LLVOAvatar::rezStatusToString(S32 rez_status) return "unknown"; } +// static +LLViewerStats::StatsAccumulator& LLViewerStats::PhaseMap::getPhaseStats(const std::string& phase_name) +{ + static LLViewerStats::StatsAccumulator junk; + return junk; +} + static const char * all_keys[] = { "duration", |