merge in jb-mr1.1-release history after reset to jb-mr1.1-dev
diff --git a/libs/gui/ConsumerBase.cpp b/libs/gui/ConsumerBase.cpp
index 624d7e0..cfc0293 100644
--- a/libs/gui/ConsumerBase.cpp
+++ b/libs/gui/ConsumerBase.cpp
@@ -109,21 +109,35 @@
 }
 
 void ConsumerBase::onBuffersReleased() {
-    Mutex::Autolock lock(mMutex);
+    sp<GraphicBuffer> bufRefs[BufferQueue::NUM_BUFFER_SLOTS];
 
-    CB_LOGV("onBuffersReleased");
+    { // Scope for the lock
+        Mutex::Autolock lock(mMutex);
 
-    if (mAbandoned) {
-        // Nothing to do if we're already abandoned.
-        return;
+        CB_LOGV("onBuffersReleased");
+
+        if (mAbandoned) {
+            // Nothing to do if we're already abandoned.
+            return;
+        }
+
+        uint32_t mask = 0;
+        mBufferQueue->getReleasedBuffers(&mask);
+        for (int i = 0; i < BufferQueue::NUM_BUFFER_SLOTS; i++) {
+            if (mask & (1 << i)) {
+                // Grab a local reference to the buffers so that they don't
+                // get freed while the lock is held.
+                bufRefs[i] = mSlots[i].mGraphicBuffer;
+
+                freeBufferLocked(i);
+            }
+        }
     }
 
-    uint32_t mask = 0;
-    mBufferQueue->getReleasedBuffers(&mask);
+    // Clear the local buffer references.  This would happen automatically
+    // when the array gets dtor'd, but I'm doing it explicitly for clarity.
     for (int i = 0; i < BufferQueue::NUM_BUFFER_SLOTS; i++) {
-        if (mask & (1 << i)) {
-            freeBufferLocked(i);
-        }
+        bufRefs[i].clear();
     }
 }