1
0
Fork 0

Flight-history men usage cap.

Beyond a certain cap (currently 4MB), recycle buckets. With the default sample rate of 1Hz, this gives over 24 hours of history before recycling.
This commit is contained in:
James Turner 2012-12-11 00:10:57 +00:00
parent 433af2b51a
commit e88e821567
2 changed files with 25 additions and 3 deletions

View file

@ -51,6 +51,7 @@ FGFlightHistory::~FGFlightHistory()
void FGFlightHistory::init()
{
m_enabled = fgGetNode("/sim/history/enabled", true);
m_sampleInterval = fgGetDouble("/sim/history/sample-interval-sec", 1.0);
if (m_sampleInterval <= 0.0) { // would be bad
SG_LOG(SG_FLIGHT, SG_INFO, "invalid flight-history sample interval:" << m_sampleInterval
@ -58,6 +59,8 @@ void FGFlightHistory::init()
m_sampleInterval = 1.0;
}
// cap memory use at 4MB
m_maxMemoryUseBytes = fgGetInt("/sim/history/max-memory-use-bytes", 1024 * 1024 * 4);
m_weightOnWheels = NULL;
// reset the history when we detect a take-off
if (fgGetBool("/sim/history/clear-on-takeoff", true)) {
@ -82,7 +85,9 @@ void FGFlightHistory::reinit()
void FGFlightHistory::update(double dt)
{
SG_UNUSED(dt); // we care about sim-time, not frame-time
if ((dt == 0.0) || !m_enabled->getBoolValue()) {
return; // paused or disabled
}
if (m_weightOnWheels) {
@ -100,7 +105,14 @@ void FGFlightHistory::update(double dt)
void FGFlightHistory::allocateNewBucket()
{
SampleBucket* bucket = new SampleBucket;
SampleBucket* bucket = NULL;
if (!m_buckets.empty() && (currentMemoryUseBytes() > m_maxMemoryUseBytes)) {
bucket = m_buckets.front();
m_buckets.erase(m_buckets.begin());
} else {
bucket = new SampleBucket;
}
m_buckets.push_back(bucket);
m_validSampleCount = 0;
}
@ -164,3 +176,8 @@ void FGFlightHistory::clear()
m_validSampleCount = SAMPLE_BUCKET_WIDTH;
}
size_t FGFlightHistory::currentMemoryUseBytes() const
{
return sizeof(SampleBucket) * m_buckets.size();
}

View file

@ -94,12 +94,17 @@ private:
unsigned int m_validSampleCount;
SGPropertyNode_ptr m_weightOnWheels;
SGPropertyNode_ptr m_enabled;
bool m_lastWoW;
size_t m_maxMemoryUseBytes;
void allocateNewBucket();
void clear();
void capture();
size_t currentMemoryUseBytes() const;
};
#endif