Home | History | Annotate | Download | only in app
      1 //
      2 // Copyright 2005 The Android Open Source Project
      3 //
      4 // Hold a collection of log messages, limiting ourselves to a certain
      5 // fixed maximum amount of memory.
      6 //
      7 #include "LogPool.h"
      8 #include <assert.h>
      9 
     10 
     11 /*
     12  * Add a message at the head of the pool.
     13  */
     14 void LogPool::Add(LogMessage* pLogMessage)
     15 {
     16     pLogMessage->Acquire();     // bump up the ref count
     17 
     18     assert(pLogMessage->GetPrev() == NULL);
     19     assert(pLogMessage->GetNext() == NULL);
     20 
     21     if (mpHead == NULL) {
     22         assert(mpTail == NULL);
     23         mpTail = mpHead = pLogMessage;
     24     } else {
     25         assert(mpHead->GetPrev() == NULL);
     26         mpHead->SetPrev(pLogMessage);
     27         pLogMessage->SetNext(mpHead);
     28         mpHead = pLogMessage;
     29     }
     30 
     31     /* update the pool size, and remove old entries if necessary */
     32     mCurrentSize += pLogMessage->GetFootprint();
     33 
     34     while (mCurrentSize > mMaxSize)
     35         RemoveOldest();
     36 }
     37 
     38 /*
     39  * Remove the oldest message (from the tail of the list).
     40  */
     41 void LogPool::RemoveOldest(void)
     42 {
     43     LogMessage* pPrev;
     44 
     45     if (mpTail == NULL) {
     46         fprintf(stderr, "HEY: nothing left to remove (cur=%ld)\n",
     47             mCurrentSize);
     48         assert(false);
     49         return;
     50     }
     51 
     52     if (mpTail == mpBookmark)
     53         mpBookmark = NULL;
     54 
     55     //printf("--- removing oldest, size %ld->%ld (%s)\n",
     56     //    mCurrentSize, mCurrentSize - mpTail->GetFootprint(),mpTail->GetMsg());
     57     mCurrentSize -= mpTail->GetFootprint();
     58 
     59     pPrev = mpTail->GetPrev();
     60     mpTail->Release();
     61     mpTail = pPrev;
     62     if (mpTail == NULL) {
     63         //printf("--- pool is now empty (size=%ld)\n", mCurrentSize);
     64         mpHead = NULL;
     65     } else {
     66         mpTail->SetNext(NULL);
     67     }
     68 }
     69 
     70 /*
     71  * Resize the log pool.
     72  */
     73 void LogPool::Resize(long maxSize)
     74 {
     75     assert(maxSize >= 0);
     76 
     77     mMaxSize = maxSize;
     78     while (mCurrentSize > mMaxSize)
     79         RemoveOldest();
     80 }
     81 
     82 /*
     83  * Remove all entries.
     84  */
     85 void LogPool::Clear(void)
     86 {
     87     while (mpTail != NULL)
     88         RemoveOldest();
     89 }
     90 
     91