BufferQueue: Hook up IProducerListener

Actually call the producer listener's callback during
IGraphicBufferConsumer::releaseBuffer

Change-Id: Idfa6bb08d62629cd3a198318e6c6fd6a731e73ef
diff --git a/libs/gui/BufferQueueConsumer.cpp b/libs/gui/BufferQueueConsumer.cpp
index 756cd61..995ed5e 100644
--- a/libs/gui/BufferQueueConsumer.cpp
+++ b/libs/gui/BufferQueueConsumer.cpp
@@ -22,6 +22,7 @@
 #include <gui/BufferQueueConsumer.h>
 #include <gui/BufferQueueCore.h>
 #include <gui/IConsumerListener.h>
+#include <gui/IProducerListener.h>
 
 namespace android {
 
@@ -261,42 +262,52 @@
         return BAD_VALUE;
     }
 
-    Mutex::Autolock lock(mCore->mMutex);
+    sp<IProducerListener> listener;
+    { // Autolock scope
+        Mutex::Autolock lock(mCore->mMutex);
 
-    // If the frame number has changed because the buffer has been reallocated,
-    // we can ignore this releaseBuffer for the old buffer
-    if (frameNumber != mSlots[slot].mFrameNumber) {
-        return STALE_BUFFER_SLOT;
-    }
+        // If the frame number has changed because the buffer has been reallocated,
+        // we can ignore this releaseBuffer for the old buffer
+        if (frameNumber != mSlots[slot].mFrameNumber) {
+            return STALE_BUFFER_SLOT;
+        }
 
-    // Make sure this buffer hasn't been queued while acquired by the consumer
-    BufferQueueCore::Fifo::iterator current(mCore->mQueue.begin());
-    while (current != mCore->mQueue.end()) {
-        if (current->mSlot == slot) {
-            BQ_LOGE("releaseBuffer: buffer slot %d pending release is "
-                    "currently queued", slot);
+        // Make sure this buffer hasn't been queued while acquired by the consumer
+        BufferQueueCore::Fifo::iterator current(mCore->mQueue.begin());
+        while (current != mCore->mQueue.end()) {
+            if (current->mSlot == slot) {
+                BQ_LOGE("releaseBuffer: buffer slot %d pending release is "
+                        "currently queued", slot);
+                return BAD_VALUE;
+            }
+            ++current;
+        }
+
+        if (mSlots[slot].mBufferState == BufferSlot::ACQUIRED) {
+            mSlots[slot].mEglDisplay = eglDisplay;
+            mSlots[slot].mEglFence = eglFence;
+            mSlots[slot].mFence = releaseFence;
+            mSlots[slot].mBufferState = BufferSlot::FREE;
+            listener = mCore->mConnectedProducerListener;
+            BQ_LOGV("releaseBuffer: releasing slot %d", slot);
+        } else if (mSlots[slot].mNeedsCleanupOnRelease) {
+            BQ_LOGV("releaseBuffer: releasing a stale buffer slot %d "
+                    "(state = %d)", slot, mSlots[slot].mBufferState);
+            mSlots[slot].mNeedsCleanupOnRelease = false;
+            return STALE_BUFFER_SLOT;
+        } else {
+            BQ_LOGV("releaseBuffer: attempted to release buffer slot %d "
+                    "but its state was %d", slot, mSlots[slot].mBufferState);
             return BAD_VALUE;
         }
-        ++current;
-    }
 
-    if (mSlots[slot].mBufferState == BufferSlot::ACQUIRED) {
-        mSlots[slot].mEglDisplay = eglDisplay;
-        mSlots[slot].mEglFence = eglFence;
-        mSlots[slot].mFence = releaseFence;
-        mSlots[slot].mBufferState = BufferSlot::FREE;
-    } else if (mSlots[slot].mNeedsCleanupOnRelease) {
-        BQ_LOGV("releaseBuffer: releasing a stale buffer slot %d "
-                "(state = %d)", slot, mSlots[slot].mBufferState);
-        mSlots[slot].mNeedsCleanupOnRelease = false;
-        return STALE_BUFFER_SLOT;
-    } else {
-        BQ_LOGV("releaseBuffer: attempted to release buffer slot %d "
-                "but its state was %d", slot, mSlots[slot].mBufferState);
-        return BAD_VALUE;
-    }
+        mCore->mDequeueCondition.broadcast();
+    } // Autolock scope
 
-    mCore->mDequeueCondition.broadcast();
+    // Call back without lock held
+    if (listener != NULL) {
+        listener->onBufferReleased();
+    }
 
     return NO_ERROR;
 }