OSDN Git Service

workaround a deadlock when taking screenshots into a surface
authorMathias Agopian <mathias@google.com>
Tue, 12 Mar 2013 00:59:59 +0000 (17:59 -0700)
committerMathias Agopian <mathias@google.com>
Tue, 12 Mar 2013 00:59:59 +0000 (17:59 -0700)
When disconnecting from BufferQueue, we now drain the queue
except the head (which means in the screenshot case we won't
have to block, but we might not have a buffer to show, this
will appear as an error in the log).

Bug: 8362363
Change-Id: If80989aac3c917beea2ebddf3cbb502849d394da

libs/gui/BufferQueue.cpp

index d93c067..41ee1be 100644 (file)
@@ -995,7 +995,7 @@ void BufferQueue::freeAllBuffersExceptHeadLocked() {
 }
 
 status_t BufferQueue::drainQueueLocked() {
-    while (mSynchronousMode && !mQueue.isEmpty()) {
+    while (mSynchronousMode && mQueue.size() > 1) {
         mDequeueCondition.wait(mMutex);
         if (mAbandoned) {
             ST_LOGE("drainQueueLocked: BufferQueue has been abandoned!");
@@ -1012,7 +1012,7 @@ status_t BufferQueue::drainQueueLocked() {
 status_t BufferQueue::drainQueueAndFreeBuffersLocked() {
     status_t err = drainQueueLocked();
     if (err == NO_ERROR) {
-        if (mSynchronousMode) {
+        if (mQueue.empty()) {
             freeAllBuffersLocked();
         } else {
             freeAllBuffersExceptHeadLocked();