summaryrefslogtreecommitdiff
path: root/indra/llcommon/lltrace.h
diff options
context:
space:
mode:
Diffstat (limited to 'indra/llcommon/lltrace.h')
-rw-r--r--indra/llcommon/lltrace.h48
1 files changed, 28 insertions, 20 deletions
diff --git a/indra/llcommon/lltrace.h b/indra/llcommon/lltrace.h
index e950a119d3..6dfe9e4b4e 100644
--- a/indra/llcommon/lltrace.h
+++ b/indra/llcommon/lltrace.h
@@ -35,6 +35,7 @@
#include "llunit.h"
#include "llapr.h"
#include "llthreadlocalstorage.h"
+#include "lltimer.h"
#include <list>
@@ -75,7 +76,6 @@ void set_thread_recorder(class ThreadRecorder*);
class MasterThreadRecorder& getUIThreadRecorder();
-// one per thread per type
template<typename ACCUMULATOR>
class AccumulatorBuffer : public LLRefCount
{
@@ -104,9 +104,9 @@ public:
~AccumulatorBuffer()
{
- if (LLThreadLocalSingletonPointer<ACCUMULATOR>::getInstance() == mStorage)
+ if (isPrimary())
{
- LLThreadLocalSingletonPointer<ACCUMULATOR>::setInstance(getDefaultBuffer()->mStorage);
+ LLThreadLocalSingletonPointer<ACCUMULATOR>::setInstance(NULL);
}
delete[] mStorage;
}
@@ -121,12 +121,12 @@ public:
return mStorage[index];
}
- void addSamples(const AccumulatorBuffer<ACCUMULATOR>& other)
+ void addSamples(const AccumulatorBuffer<ACCUMULATOR>& other, bool append = true)
{
llassert(mStorageSize >= sNextStorageSlot && other.mStorageSize > sNextStorageSlot);
for (size_t i = 0; i < sNextStorageSlot; i++)
{
- mStorage[i].addSamples(other.mStorage[i]);
+ mStorage[i].addSamples(other.mStorage[i], append);
}
}
@@ -169,7 +169,8 @@ public:
LL_FORCE_INLINE static ACCUMULATOR* getPrimaryStorage()
{
- return LLThreadLocalSingletonPointer<ACCUMULATOR>::getInstance();
+ ACCUMULATOR* accumulator = LLThreadLocalSingletonPointer<ACCUMULATOR>::getInstance();
+ return accumulator ? accumulator : sDefaultBuffer->mStorage;
}
// NOTE: this is not thread-safe. We assume that slots are reserved in the main thread before any child threads are spawned
@@ -222,25 +223,27 @@ public:
static self_t* getDefaultBuffer()
{
- // this buffer is allowed to leak so that trace calls from global destructors have somewhere to put their data
- // so as not to trigger an access violation
- static self_t* sBuffer = new AccumulatorBuffer(StaticAllocationMarker());
static bool sInitialized = false;
if (!sInitialized)
{
- sBuffer->resize(DEFAULT_ACCUMULATOR_BUFFER_SIZE);
+ // this buffer is allowed to leak so that trace calls from global destructors have somewhere to put their data
+ // so as not to trigger an access violation
+ sDefaultBuffer = new AccumulatorBuffer(StaticAllocationMarker());
sInitialized = true;
+ sDefaultBuffer->resize(DEFAULT_ACCUMULATOR_BUFFER_SIZE);
}
- return sBuffer;
+ return sDefaultBuffer;
}
private:
ACCUMULATOR* mStorage;
size_t mStorageSize;
static size_t sNextStorageSlot;
+ static self_t* sDefaultBuffer;
};
template<typename ACCUMULATOR> size_t AccumulatorBuffer<ACCUMULATOR>::sNextStorageSlot = 0;
+template<typename ACCUMULATOR> AccumulatorBuffer<ACCUMULATOR>* AccumulatorBuffer<ACCUMULATOR>::sDefaultBuffer = NULL;
template<typename ACCUMULATOR>
class TraceType
@@ -307,7 +310,7 @@ public:
mLastValue = value;
}
- void addSamples(const self_t& other)
+ void addSamples(const self_t& other, bool append)
{
if (other.mNumSamples)
{
@@ -347,7 +350,7 @@ public:
F64 weight = (F64)mNumSamples / (F64)(mNumSamples + other.mNumSamples);
mNumSamples += other.mNumSamples;
mMean = mMean * weight + other.mMean * (1.f - weight);
- mLastValue = other.mLastValue;
+ if (append) mLastValue = other.mLastValue;
}
}
@@ -431,7 +434,7 @@ public:
mHasValue = true;
}
- void addSamples(const self_t& other)
+ void addSamples(const self_t& other, bool append)
{
if (other.mTotalSamplingTime)
{
@@ -473,9 +476,12 @@ public:
mNumSamples += other.mNumSamples;
mTotalSamplingTime += other.mTotalSamplingTime;
mMean = (mMean * weight) + (other.mMean * (1.0 - weight));
- mLastValue = other.mLastValue;
- mLastSampleTimeStamp = other.mLastSampleTimeStamp;
- mHasValue |= other.mHasValue;
+ if (append)
+ {
+ mLastValue = other.mLastValue;
+ mLastSampleTimeStamp = other.mLastSampleTimeStamp;
+ mHasValue |= other.mHasValue;
+ }
}
}
@@ -548,7 +554,7 @@ public:
mSum += value;
}
- void addSamples(const CountAccumulator<T>& other)
+ void addSamples(const CountAccumulator<T>& other, bool /*append*/)
{
mSum += other.mSum;
mNumSamples += other.mNumSamples;
@@ -593,7 +599,7 @@ public:
};
TimeBlockAccumulator();
- void addSamples(const self_t& other);
+ void addSamples(const self_t& other, bool /*append*/);
void reset(const self_t* other);
void flush() {}
@@ -713,6 +719,8 @@ void add(CountStatHandle<T>& count, VALUE_T value)
struct MemStatAccumulator
{
+ typedef MemStatAccumulator self_t;
+
MemStatAccumulator()
: mSize(0),
mChildSize(0),
@@ -720,7 +728,7 @@ struct MemStatAccumulator
mDeallocatedCount(0)
{}
- void addSamples(const MemStatAccumulator& other)
+ void addSamples(const MemStatAccumulator& other, bool /*append*/)
{
mSize += other.mSize;
mChildSize += other.mChildSize;