OSDN Git Service

BufferQueue: remove freeAllBuffersExceptHeadLocked()
authorLajos Molnar <lajos@google.com>
Mon, 6 May 2013 23:23:07 +0000 (16:23 -0700)
committerAndroid (Google) Code Review <android-gerrit@google.com>
Thu, 23 May 2013 22:21:13 +0000 (22:21 +0000)
Now that we are having separate buffer-instances for the buffer-
queue, we can free all buffers; we don't have to keep the head
alive.

Change-Id: I023e9161a2501d99333f8868ce438afa914ec50f
Signed-off-by: Lajos Molnar <lajos@google.com>
Related-to-bug: 7093648

include/gui/BufferQueue.h
libs/gui/BufferQueue.cpp

index 8475a71..766fa0f 100644 (file)
@@ -373,10 +373,6 @@ private:
     // all slots.
     void freeAllBuffersLocked();
 
-    // freeAllBuffersExceptHeadLocked frees the GraphicBuffer and sync
-    // resources for all slots except the head of mQueue.
-    void freeAllBuffersExceptHeadLocked();
-
     // drainQueueLocked waits for the buffer queue to empty if we're in
     // synchronous mode, or returns immediately otherwise. It returns NO_INIT
     // if the BufferQueue is abandoned (consumer disconnected) or disconnected
index 34dbd71..0dab864 100644 (file)
@@ -178,12 +178,10 @@ status_t BufferQueue::setBufferCount(int bufferCount) {
         }
 
         // here we're guaranteed that the client doesn't have dequeued buffers
-        // and will release all of its buffer references.
-        //
-        // XXX: Should this use drainQueueAndFreeBuffersLocked instead?
+        // and will release all of its buffer references.  We don't clear the
+        // queue, however, so currently queued buffers still get displayed.
         freeAllBuffersLocked();
         mOverrideMaxBufferCount = bufferCount;
-        mBufferHasBeenQueued = false;
         mDequeueCondition.broadcast();
         listener = mConsumerListener;
     } // scope for lock
@@ -801,9 +799,8 @@ void BufferQueue::freeBufferLocked(int slot) {
 }
 
 void BufferQueue::freeAllBuffersLocked() {
-    ALOGW_IF(!mQueue.isEmpty(),
-            "freeAllBuffersLocked called but mQueue is not empty");
-    mQueue.clear();
+    ALOGD_IF(!mQueue.isEmpty(),
+            "freeAllBuffersLocked called with non-empty mQueue");
     mBufferHasBeenQueued = false;
     for (int i = 0; i < NUM_BUFFER_SLOTS; i++) {
         freeBufferLocked(i);
@@ -1026,18 +1023,6 @@ status_t BufferQueue::setMaxAcquiredBufferCount(int maxAcquiredBuffers) {
     return NO_ERROR;
 }
 
-void BufferQueue::freeAllBuffersExceptHeadLocked() {
-    // only called if mQueue is not empty
-    Fifo::iterator front(mQueue.begin());
-    mBufferHasBeenQueued = false;
-    for (int i = 0; i < NUM_BUFFER_SLOTS; i++) {
-        const BufferSlot &slot = mSlots[i];
-        if (slot.mGraphicBuffer == NULL ||
-            slot.mGraphicBuffer->handle != front->mGraphicBuffer->handle)
-            freeBufferLocked(i);
-    }
-}
-
 status_t BufferQueue::drainQueueLocked() {
     while (mSynchronousMode && mQueue.size() > 1) {
         mDequeueCondition.wait(mMutex);
@@ -1056,11 +1041,7 @@ status_t BufferQueue::drainQueueLocked() {
 status_t BufferQueue::drainQueueAndFreeBuffersLocked() {
     status_t err = drainQueueLocked();
     if (err == NO_ERROR) {
-        if (mQueue.empty()) {
-            freeAllBuffersLocked();
-        } else {
-            freeAllBuffersExceptHeadLocked();
-        }
+        freeAllBuffersLocked();
     }
     return err;
 }