summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Linden <none@none>2012-11-27 17:26:12 -0800
committerRichard Linden <none@none>2012-11-27 17:26:12 -0800
commit1c894c05c10ef37be6507ee4bc4e9173506adfb6 (patch)
treee8136ca59f5e18ad18ed974fb0c7f722b62cd8c2
parent5d51175cd79b15cf036cd7e6bd646a1a0777eb7f (diff)
SH-3406 WIP convert fast timers to lltrace system
hunting down bad values and crashes
-rw-r--r--indra/llcommon/llfasttimer.cpp24
-rw-r--r--indra/llcommon/llfasttimer.h8
-rw-r--r--indra/llcommon/lltrace.h1
-rw-r--r--indra/llcommon/lltracerecording.cpp5
-rw-r--r--indra/llcommon/lltracethreadrecorder.cpp4
-rw-r--r--indra/newview/app_settings/logcontrol.xml1
-rw-r--r--indra/newview/llappviewer.cpp3
-rw-r--r--indra/newview/llviewerassetstats.cpp25
-rw-r--r--indra/newview/llviewerassetstats.h7
9 files changed, 60 insertions, 18 deletions
diff --git a/indra/llcommon/llfasttimer.cpp b/indra/llcommon/llfasttimer.cpp
index e1549b4bff..16dd21332c 100644
--- a/indra/llcommon/llfasttimer.cpp
+++ b/indra/llcommon/llfasttimer.cpp
@@ -177,8 +177,8 @@ BlockTimer::BlockTimer(const char* name, bool open, BlockTimer* parent)
mParent = this;
}
- mCountHistory = new U32[HISTORY_NUM];
- memset(mCountHistory, 0, sizeof(U32) * HISTORY_NUM);
+ mCountHistory = new U64[HISTORY_NUM];
+ memset(mCountHistory, 0, sizeof(U64) * HISTORY_NUM);
mCallHistory = new U32[HISTORY_NUM];
memset(mCallHistory, 0, sizeof(U32) * HISTORY_NUM);
}
@@ -266,9 +266,12 @@ void BlockTimer::buildHierarchy()
// bootstrap tree construction by attaching to last timer to be on stack
// when this timer was called
- if (timer.getPrimaryAccumulator().mLastCaller && timer.mParent == &BlockTimer::getRootTimer())
+ if (timer.mParent == &BlockTimer::getRootTimer())
{
- timer.setParent(timer.getPrimaryAccumulator().mLastCaller);
+ if (timer.getPrimaryAccumulator().mLastCaller)
+ {
+ timer.setParent(timer.getPrimaryAccumulator().mLastCaller);
+ }
// no need to push up tree on first use, flag can be set spuriously
timer.getPrimaryAccumulator().mMoveUpTree = false;
}
@@ -317,7 +320,7 @@ void BlockTimer::buildHierarchy()
//static
void BlockTimer::accumulateTimings()
{
- U32 cur_time = getCPUClockCount32();
+ U64 cur_time = getCPUClockCount64();
// walk up stack of active timers and accumulate current time while leaving timing structures active
Time* cur_timer = sCurTimerData->mCurTimer;
@@ -326,8 +329,8 @@ void BlockTimer::accumulateTimings()
TimerAccumulator& accumulator = sCurTimerData->mTimerData->getPrimaryAccumulator();
while(cur_timer && cur_timer->mLastTimerData.mCurTimer != cur_timer)
{
- U32 cumulative_time_delta = cur_time - cur_timer->mStartTime;
- U32 self_time_delta = cumulative_time_delta - cur_data->mChildTime;
+ U64 cumulative_time_delta = cur_time - cur_timer->mStartTime;
+ U64 self_time_delta = cumulative_time_delta - cur_data->mChildTime;
cur_data->mChildTime = 0;
accumulator.mSelfTimeCounter += self_time_delta;
accumulator.mTotalTimeCounter += cumulative_time_delta;
@@ -429,6 +432,7 @@ void BlockTimer::resetFrame()
BlockTimer& timer = *it;
TimerAccumulator& accumulator = timer.getPrimaryAccumulator();
accumulator.mSelfTimeCounter = 0;
+ accumulator.mTotalTimeCounter = 0;
accumulator.mCalls = 0;
accumulator.mLastCaller = NULL;
accumulator.mMoveUpTree = false;
@@ -442,7 +446,7 @@ void BlockTimer::reset()
// walk up stack of active timers and reset start times to current time
// effectively zeroing out any accumulated time
- U32 cur_time = getCPUClockCount32();
+ U64 cur_time = getCPUClockCount64();
// root defined by parent pointing to self
CurTimerData* cur_data = sCurTimerData.get();
@@ -471,7 +475,7 @@ void BlockTimer::reset()
timer.mCountAverage = 0;
timer.mCallAverage = 0;
- memset(timer.mCountHistory, 0, sizeof(U32) * HISTORY_NUM);
+ memset(timer.mCountHistory, 0, sizeof(U64) * HISTORY_NUM);
memset(timer.mCallHistory, 0, sizeof(U32) * HISTORY_NUM);
}
}
@@ -480,7 +484,7 @@ void BlockTimer::reset()
sCurFrameIndex = 0;
}
-U32 BlockTimer::getHistoricalCount(S32 history_index) const
+U64 BlockTimer::getHistoricalCount(S32 history_index) const
{
S32 history_idx = (getLastFrameIndex() + history_index) % HISTORY_NUM;
return mCountHistory[history_idx];
diff --git a/indra/llcommon/llfasttimer.h b/indra/llcommon/llfasttimer.h
index af9b360e01..cfe2cf5371 100644
--- a/indra/llcommon/llfasttimer.h
+++ b/indra/llcommon/llfasttimer.h
@@ -93,7 +93,7 @@ public:
U32 getCountAverage() const { return mCountAverage; }
U32 getCallAverage() const { return mCallAverage; }
- U32 getHistoricalCount(S32 history_index = 0) const;
+ U64 getHistoricalCount(S32 history_index = 0) const;
U32 getHistoricalCalls(S32 history_index = 0) const;
static BlockTimer& getRootTimer();
@@ -258,12 +258,12 @@ public:
// sum of recorded self time and tree time of all children timers (might not match actual recorded time of children if topology is incomplete
- U32 mTreeTimeCounter;
+ U64 mTreeTimeCounter;
- U32 mCountAverage;
+ U64 mCountAverage;
U32 mCallAverage;
- U32* mCountHistory;
+ U64* mCountHistory;
U32* mCallHistory;
// tree structure
diff --git a/indra/llcommon/lltrace.h b/indra/llcommon/lltrace.h
index 61d14569cd..11651ef953 100644
--- a/indra/llcommon/lltrace.h
+++ b/indra/llcommon/lltrace.h
@@ -107,6 +107,7 @@ namespace LLTrace
//TODO pick another primary?
sPrimaryStorage = NULL;
}
+ delete[] mStorage;
}
LL_FORCE_INLINE ACCUMULATOR& operator[](size_t index)
diff --git a/indra/llcommon/lltracerecording.cpp b/indra/llcommon/lltracerecording.cpp
index 4252ed57dc..e7ed55e8ae 100644
--- a/indra/llcommon/lltracerecording.cpp
+++ b/indra/llcommon/lltracerecording.cpp
@@ -66,7 +66,10 @@ Recording::Recording( const Recording& other )
Recording::~Recording()
-{}
+{
+ stop();
+ llassert(isStopped());
+}
void Recording::update()
{
diff --git a/indra/llcommon/lltracethreadrecorder.cpp b/indra/llcommon/lltracethreadrecorder.cpp
index c2fefe2957..faaab4c8e7 100644
--- a/indra/llcommon/lltracethreadrecorder.cpp
+++ b/indra/llcommon/lltracethreadrecorder.cpp
@@ -53,6 +53,10 @@ ThreadRecorder::ThreadRecorder( const ThreadRecorder& other )
ThreadRecorder::~ThreadRecorder()
{
+ while(mActiveRecordings.size())
+ {
+ mActiveRecordings.front().mTargetRecording->stop();
+ }
get_thread_recorder() = NULL;
delete BlockTimer::sCurTimerData.get();
BlockTimer::sCurTimerData = NULL;
diff --git a/indra/newview/app_settings/logcontrol.xml b/indra/newview/app_settings/logcontrol.xml
index 92a241857e..b9ae7ebf0b 100644
--- a/indra/newview/app_settings/logcontrol.xml
+++ b/indra/newview/app_settings/logcontrol.xml
@@ -42,6 +42,7 @@
</array>
<key>tags</key>
<array>
+ <string>FastTimers</string>
<!-- sample entry for debugging specific items
<string>Avatar</string>
<string>Voice</string>
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index f73fc4b990..839094fc47 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -438,7 +438,7 @@ LLAppViewer::LLUpdaterInfo *LLAppViewer::sUpdaterInfo = NULL ;
//----------------------------------------------------------------------------
// Metrics logging control constants
//----------------------------------------------------------------------------
-static const F32 METRICS_INTERVAL_DEFAULT = 600.0;
+static const F32 METRICS_INTERVAL_DEFAULT = 30.0;
static const F32 METRICS_INTERVAL_QA = 30.0;
static F32 app_metrics_interval = METRICS_INTERVAL_DEFAULT;
static bool app_metrics_qa_mode = false;
@@ -5308,6 +5308,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(*gViewerAssetStats));
+ main_stats->stop();
main_stats->updateStats();
diff --git a/indra/newview/llviewerassetstats.cpp b/indra/newview/llviewerassetstats.cpp
index 73a2e24424..d79d98aaaf 100644
--- a/indra/newview/llviewerassetstats.cpp
+++ b/indra/newview/llviewerassetstats.cpp
@@ -239,7 +239,7 @@ LLViewerAssetStats::LLViewerAssetStats()
: mRegionHandle(U64(0)),
mCurRecording(NULL)
{
- reset();
+ start();
}
@@ -252,6 +252,29 @@ LLViewerAssetStats::LLViewerAssetStats(const LLViewerAssetStats & src)
mRegionRecordings = src.mRegionRecordings;
mCurRecording = &mRegionRecordings[mRegionHandle];
+ mCurRecording->stop();
+ LLStopWatchControlsMixin::initTo(src.getPlayState());
+}
+
+void LLViewerAssetStats::handleStart()
+{
+ if (mCurRecording)
+ {
+ mCurRecording->start();
+ }
+}
+
+void LLViewerAssetStats::handleStop()
+{
+ if (mCurRecording)
+ {
+ mCurRecording->stop();
+ }
+}
+
+void LLViewerAssetStats::handleReset()
+{
+ reset();
}
diff --git a/indra/newview/llviewerassetstats.h b/indra/newview/llviewerassetstats.h
index 835df89149..5b25d791a9 100644
--- a/indra/newview/llviewerassetstats.h
+++ b/indra/newview/llviewerassetstats.h
@@ -74,7 +74,7 @@
* LLViewerAssetStatsFF is provided for conditional test-and-call
* operations.
*/
-class LLViewerAssetStats
+class LLViewerAssetStats : public LLStopWatchControlsMixin<LLViewerAssetStats>
{
public:
/**
@@ -177,6 +177,7 @@ public:
public:
LLViewerAssetStats();
LLViewerAssetStats(const LLViewerAssetStats &);
+
// Default destructor is correct.
LLViewerAssetStats & operator=(const LLViewerAssetStats &); // Not defined
@@ -202,6 +203,10 @@ public:
LLSD asLLSD(bool compact_output);
protected:
+ void handleStart();
+ void handleStop();
+ void handleReset();
+
typedef std::map<region_handle_t, LLTrace::Recording > PerRegionRecordingContainer;
// Region of the currently-active region. Always valid but may