//
// Copyright 2005 The Android Open Source Project
//
// Hold a collection of log messages, limiting ourselves to a certain
// fixed maximum amount of memory.
//
#include "LogPool.h"
#include <assert.h>
/*
* Add a message at the head of the pool.
*/
void LogPool::Add(LogMessage* pLogMessage)
{
pLogMessage->Acquire(); // bump up the ref count
assert(pLogMessage->GetPrev() == NULL);
assert(pLogMessage->GetNext() == NULL);
if (mpHead == NULL) {
assert(mpTail == NULL);
mpTail = mpHead = pLogMessage;
} else {
assert(mpHead->GetPrev() == NULL);
mpHead->SetPrev(pLogMessage);
pLogMessage->SetNext(mpHead);
mpHead = pLogMessage;
}
/* update the pool size, and remove old entries if necessary */
mCurrentSize += pLogMessage->GetFootprint();
while (mCurrentSize > mMaxSize)
RemoveOldest();
}
/*
* Remove the oldest message (from the tail of the list).
*/
void LogPool::RemoveOldest(void)
{
LogMessage* pPrev;
if (mpTail == NULL) {
fprintf(stderr, "HEY: nothing left to remove (cur=%ld)\n",
mCurrentSize);
assert(false);
return;
}
if (mpTail == mpBookmark)
mpBookmark = NULL;
//printf("--- removing oldest, size %ld->%ld (%s)\n",
// mCurrentSize, mCurrentSize - mpTail->GetFootprint(),mpTail->GetMsg());
mCurrentSize -= mpTail->GetFootprint();
pPrev = mpTail->GetPrev();
mpTail->Release();
mpTail = pPrev;
if (mpTail == NULL) {
//printf("--- pool is now empty (size=%ld)\n", mCurrentSize);
mpHead = NULL;
} else {
mpTail->SetNext(NULL);
}
}
/*
* Resize the log pool.
*/
void LogPool::Resize(long maxSize)
{
assert(maxSize >= 0);
mMaxSize = maxSize;
while (mCurrentSize > mMaxSize)
RemoveOldest();
}
/*
* Remove all entries.
*/
void LogPool::Clear(void)
{
while (mpTail != NULL)
RemoveOldest();
}