diff options
author | Richard Linden <none@none> | 2012-09-07 18:51:38 -0700 |
---|---|---|
committer | Richard Linden <none@none> | 2012-09-07 18:51:38 -0700 |
commit | a8c0d23bdeb009f6797f1dfa727e8c0cf4f6bc96 (patch) | |
tree | 17011d7fd71e06ddcd727c32f849a77acc686aa1 /indra/llcommon/lltrace.h | |
parent | f015903c86225e9c92f9514b4974c661bfb7c8fd (diff) |
SH-3275 WIP Run viewer metrics for object update messages
created buffer type for storing trace data
added merging logic for different trace types
Diffstat (limited to 'indra/llcommon/lltrace.h')
-rw-r--r-- | indra/llcommon/lltrace.h | 156 |
1 files changed, 90 insertions, 66 deletions
diff --git a/indra/llcommon/lltrace.h b/indra/llcommon/lltrace.h index c6940c12a2..c5bde0330a 100644 --- a/indra/llcommon/lltrace.h +++ b/indra/llcommon/lltrace.h @@ -37,24 +37,57 @@ namespace LLTrace { //TODO figure out best way to do this and proper naming convention - static - void init() + static void init() { } + template<typename ACCUMULATOR> + class Trace + { + public: + Trace(const std::string& name) + : mName(name) + { + mStorageIndex = sNextIndex++; + sStorage.reserve(sNextIndex); + } + + LL_FORCE_INLINE ACCUMULATOR& getAccumulator() + { + return sStorage[mStorageIndex]; + } + + void mergeFrom(const Trace<ACCUMULATOR>& other) + { + getAccumulator().mergeFrom(other.getAccumulator()); + } + + + private: + std::string mName; + ptrdiff_t mStorageIndex; + + // this needs to be thread local + static std::vector<ACCUMULATOR> sStorage; + static size_t sNextIndex; + }; + + template<typename ACCUMULATOR> std::vector<ACCUMULATOR> Trace<ACCUMULATOR>::sStorage; + template<typename ACCUMULATOR> size_t Trace<ACCUMULATOR>::sNextIndex = 0; + template<typename T> class Accumulator { public: Accumulator() - : mSum(), + : mSum(), mMin(), mMax(), mNumSamples(0) {} - void sample(T value) + LL_FORCE_INLINE void sample(T value) { mNumSamples++; mSum += value; @@ -68,6 +101,20 @@ namespace LLTrace } } + void mergeFrom(const Accumulator<T>& other) + { + mSum += other.mSum; + if (other.mMin < mMin) + { + mMin = other.mMin; + } + if (other.mMax > mMax) + { + mMax = other.mMax; + } + mNumSamples += other.mNumSamples; + } + private: T mSum, mMin, @@ -76,78 +123,55 @@ namespace LLTrace U32 mNumSamples; }; - class TraceStorage - { - protected: - TraceStorage(const size_t size, const size_t alignment) - { - mRecordOffset = sNextOffset + (alignment - 1); - mRecordOffset -= mRecordOffset % alignment; - sNextOffset = mRecordOffset + size; - sStorage.reserve((size_t)sNextOffset); - } - - // this needs to be thread local - static std::vector<U8> sStorage; - static ptrdiff_t sNextOffset; - - ptrdiff_t mRecordOffset; - }; - - std::vector<U8> TraceStorage::sStorage; - ptrdiff_t TraceStorage::sNextOffset = 0; template<typename T> - class Trace : public TraceStorage + class Stat : public Trace<Accumulator<T> > { public: - Trace(const std::string& name) - : TraceStorage(sizeof(Accumulator<T>), boost::alignment_of<Accumulator<T> >::value), - mName(name) + Stat(const char* name) + : Trace(name) {} - void record(T value) + void sample(T value) { - (reinterpret_cast<Accumulator<T>* >(sStorage + mRecordOffset))->sample(value); + getAccumulator().sample(value); } - private: - std::string mName; }; - template<typename T> - class Stat : public Trace<T> + struct TimerAccumulator { - public: - Stat(const char* name) - : Trace(name) - {} + U32 mTotalTimeCounter, + mChildTimeCounter, + mCalls; + TimerAccumulator* mParent; // info for caller timer + TimerAccumulator* mLastCaller; // used to bootstrap tree construction + const BlockTimer* mTimer; // points to block timer associated with this storage + U8 mActiveCount; // number of timers with this ID active on stack + bool mMoveUpTree; // needs to be moved up the tree of timers at the end of frame + std::vector<TimerAccumulator*> mChildren; // currently assumed child timers + + void mergeFrom(const TimerAccumulator& other) + { + mTotalTimeCounter += other.mTotalTimeCounter; + mChildTimeCounter += other.mChildTimeCounter; + mCalls += other.mCalls; + } }; - class BlockTimer : public Trace<U32> + class BlockTimer : public Trace<TimerAccumulator> { public: BlockTimer(const char* name) : Trace(name) {} - struct Accumulator - { - U32 mTotalTimeCounter, - mChildTimeCounter, - mCalls; - Accumulator* mParent; // info for caller timer - Accumulator* mLastCaller; // used to bootstrap tree construction - const BlockTimer* mTimer; // points to block timer associated with this storage - U8 mActiveCount; // number of timers with this ID active on stack - bool mMoveUpTree; // needs to be moved up the tree of timers at the end of frame - std::vector<Accumulator*> mChildren; // currently assumed child timers - }; + struct Recorder; struct RecorderStackEntry { - struct Recorder* mRecorder; - Accumulator* mAccumulator; + Recorder* mRecorder; + TimerAccumulator* mAccumulator; U32 mChildTime; }; @@ -157,7 +181,7 @@ namespace LLTrace : mLastRecorder(sCurRecorder) { mStartTime = getCPUClockCount32(); - Accumulator* accumulator = ???; // get per-thread accumulator + TimerAccumulator* accumulator = &block_timer.getAccumulator(); // get per-thread accumulator accumulator->mActiveCount++; accumulator->mCalls++; accumulator->mMoveUpTree |= (accumulator->mParent->mActiveCount == 0); @@ -172,7 +196,7 @@ namespace LLTrace { U32 total_time = getCPUClockCount32() - mStartTime; - Accumulator* accumulator = sCurRecorder.mAccumulator; + TimerAccumulator* accumulator = sCurRecorder.mAccumulator; accumulator->mTotalTimeCounter += total_time; accumulator->mChildTimeCounter += sCurRecorder.mChildTime; accumulator->mActiveCount--; @@ -195,11 +219,11 @@ namespace LLTrace __asm { _emit 0x0f - _emit 0x31 - shr eax,8 - shl edx,24 - or eax, edx - mov dword ptr [ret_val], eax + _emit 0x31 + shr eax,8 + shl edx,24 + or eax, edx + mov dword ptr [ret_val], eax } return ret_val; } @@ -211,11 +235,11 @@ namespace LLTrace __asm { _emit 0x0f - _emit 0x31 - mov eax,eax - mov edx,edx - mov dword ptr [ret_val+4], edx - mov dword ptr [ret_val], eax + _emit 0x31 + mov eax,eax + mov edx,edx + mov dword ptr [ret_val+4], edx + mov dword ptr [ret_val], eax } return ret_val; } @@ -233,7 +257,7 @@ namespace LLTrace void resume() {} }; - class SamplingTimeInterval + class Sampler { public: void start() {} |