auto import from //depot/cupcake/@135843
diff --git a/simulator/app/LogPool.cpp b/simulator/app/LogPool.cpp
new file mode 100644
index 0000000..43bf4be
--- /dev/null
+++ b/simulator/app/LogPool.cpp
@@ -0,0 +1,90 @@
+//
+// 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();
+}
+