Fixed div-by-zero issues in LLStat.

This commit is contained in:
Shyotl
2015-05-15 00:45:48 -05:00
parent 8943439629
commit aa9cc7a50d
2 changed files with 35 additions and 98 deletions

View File

@@ -44,7 +44,6 @@ LLFrameTimer LLStat::sFrameTimer;
void LLStat::reset()
{
mNumValues = 0;
mLastValue = 0.f;
delete[] mBins;
mBins = new ValueEntry[mNumBins];
mCurBin = mNumBins-1;
@@ -57,8 +56,7 @@ LLStat::LLStat(std::string name, S32 num_bins, BOOL use_frame_timer)
mName(name),
mBins(NULL)
{
llassert(mNumBins > 0);
mLastTime = 0.f;
llassert_always(mNumBins > 1);
reset();
@@ -115,16 +113,8 @@ void LLStat::addValue(const F32 value)
}
// Increment the bin counters.
mCurBin++;
if ((U32)mCurBin >= mNumBins)
{
mCurBin = 0;
}
mNextBin++;
if ((U32)mNextBin >= mNumBins)
{
mNextBin = 0;
}
mCurBin = ++mCurBin % mNumBins;
mNextBin = ++mNextBin % mNumBins;
mBins[mCurBin].mValue = value;
if (mUseFrameTimer)
@@ -137,10 +127,6 @@ void LLStat::addValue(const F32 value)
}
mBins[mCurBin].mDT = (F32)(mBins[mCurBin].mTime - mBins[mCurBin].mBeginTime);
//this value is used to prime the min/max calls
mLastTime = mBins[mCurBin].mTime;
mLastValue = value;
// Set the begin time for the next stat segment.
mBins[mNextBin].mBeginTime = mBins[mCurBin].mTime;
mBins[mNextBin].mTime = mBins[mCurBin].mTime;
@@ -150,36 +136,25 @@ void LLStat::addValue(const F32 value)
F32 LLStat::getMax() const
{
S32 i;
F32 current_max = mLastValue;
if (mNumBins == 0)
F32 current_max = getCurrent();
for (S32 i = 0; i < (S32)mNumValues; i++)
{
current_max = 0.f;
}
else
{
for (i = 0; (i < (S32)mNumBins) && (i < (S32)mNumValues); i++)
// Skip the bin we're currently filling.
if (i == mNextBin)
{
// Skip the bin we're currently filling.
if (i == mNextBin)
{
continue;
}
if (mBins[i].mValue > current_max)
{
current_max = mBins[i].mValue;
}
continue;
}
current_max = llmax(current_max, mBins[i].mValue);
}
return current_max;
}
F32 LLStat::getMean() const
{
S32 i;
F32 current_mean = 0.f;
F32 current_mean = getCurrent();
S32 samples = 0;
for (i = 0; (i < (S32)mNumBins) && (i < (S32)mNumValues); i++)
for (S32 i = 0; i < (S32)mNumValues; i++)
{
// Skip the bin we're currently filling.
if (i == mNextBin)
@@ -204,28 +179,18 @@ F32 LLStat::getMean() const
F32 LLStat::getMin() const
{
S32 i;
F32 current_min = mLastValue;
F32 current_min = getCurrent();
if (mNumBins == 0)
for (S32 i = 0; i < (S32)mNumValues; i++)
{
current_min = 0.f;
}
else
{
for (i = 0; (i < (S32)mNumBins) && (i < (S32)mNumValues); i++)
// Skip the bin we're currently filling.
if (i == mNextBin)
{
// Skip the bin we're currently filling.
if (i == mNextBin)
{
continue;
}
if (mBins[i].mValue < current_min)
{
current_min = mBins[i].mValue;
}
continue;
}
current_min = llmin(current_min, mBins[i].mValue);
}
return current_min;
}
@@ -262,7 +227,7 @@ F32 LLStat::getPrevPerSec(S32 age) const
// Bogus for bin we're currently working on.
return 0.f;
}
return mBins[bin].mValue / mBins[bin].mDT;
return (U32(bin) < mNumValues) ? (mBins[bin].mValue / mBins[bin].mDT) : 0.f;
}
F64 LLStat::getPrevBeginTime(S32 age) const
@@ -316,7 +281,7 @@ F32 LLStat::getCurrent() const
F32 LLStat::getCurrentPerSec() const
{
return mBins[mCurBin].mValue / mBins[mCurBin].mDT;
return (U32(mCurBin) < mNumValues) ? (mBins[mCurBin].mValue / mBins[mCurBin].mDT) : 0.f;
}
F32 LLStat::getCurrentDuration() const
@@ -324,13 +289,17 @@ F32 LLStat::getCurrentDuration() const
return mBins[mCurBin].mDT;
}
F64 LLStat::getCurrentTime() const
{
return mBins[mCurBin].mTime;
}
F32 LLStat::getMeanPerSec() const
{
S32 i;
F32 value = 0.f;
F32 dt = 0.f;
for (i = 0; (i < (S32)mNumBins) && (i < (S32)mNumValues); i++)
for (S32 i = 0; i < (S32)mNumValues; i++)
{
// Skip the bin we're currently filling.
if (i == mNextBin)
@@ -355,7 +324,7 @@ F32 LLStat::getMeanDuration() const
{
F32 dur = 0.0f;
S32 count = 0;
for (S32 i=0; (i < (S32)mNumBins) && (i < (S32)mNumValues); i++)
for (S32 i=0; i < (S32)mNumValues; i++)
{
if (i == mNextBin)
{
@@ -378,22 +347,9 @@ F32 LLStat::getMeanDuration() const
F32 LLStat::getMaxPerSec() const
{
F32 value;
F32 value = 0.f;
if (mNextBin != 0)
{
value = mBins[0].mValue/mBins[0].mDT;
}
else if (mNumValues > 0)
{
value = mBins[1].mValue/mBins[1].mDT;
}
else
{
value = 0.f;
}
for (S32 i = 0; (i < (S32)mNumBins) && (i < (S32)mNumValues); i++)
for (S32 i = 0; i < (S32)mNumValues; i++)
{
// Skip the bin we're currently filling.
if (i == mNextBin)
@@ -407,23 +363,9 @@ F32 LLStat::getMaxPerSec() const
F32 LLStat::getMinPerSec() const
{
S32 i;
F32 value;
if (mNextBin != 0)
{
value = mBins[0].mValue/mBins[0].mDT;
}
else if (mNumValues > 0)
{
value = mBins[1].mValue/mBins[0].mDT;
}
else
{
value = 0.f;
}
F32 value = 0.f;
for (i = 0; (i < (S32)mNumBins) && (i < (S32)mNumValues); i++)
for (S32 i = 0; i < (S32)mNumValues; i++)
{
// Skip the bin we're currently filling.
if (i == mNextBin)
@@ -455,7 +397,3 @@ S32 LLStat::getNextBin() const
return mNextBin;
}
F64 LLStat::getLastTime() const
{
return mLastTime;
}