| // |
| // 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(); |
| } |
| |