OSDN Git Service

Handle failed requestBuffer after successful dequeueBuffer
authorJesse Hall <jessehall@google.com>
Tue, 29 Apr 2014 23:14:14 +0000 (16:14 -0700)
committerJesse Hall <jessehall@google.com>
Thu, 1 May 2014 17:37:33 +0000 (10:37 -0700)
If the virtual display consumer disconnects after the
VirtualDisplaySurface dequeues a buffer but before it requests it, the
request will fail. Previously the error was ignored, and the caller
would get a success result but a NULL buffer. Now the dequeued buffer
is cancelled and the error propagated to the caller.

Bug: 14140551
Change-Id: I91547885c2cf6063dc7a8f02d97f2df282cdde2c

services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp

index 1362ae8..c415560 100644 (file)
@@ -302,7 +302,12 @@ status_t VirtualDisplaySurface::dequeueBuffer(Source source,
         }
     }
     if (result & BUFFER_NEEDS_REALLOCATION) {
-        mSource[source]->requestBuffer(*sslot, &mProducerBuffers[pslot]);
+        result = mSource[source]->requestBuffer(*sslot, &mProducerBuffers[pslot]);
+        if (result < 0) {
+            mProducerBuffers[pslot].clear();
+            mSource[source]->cancelBuffer(*sslot, *fence);
+            return result;
+        }
         VDS_LOGV("dequeueBuffer(%s): buffers[%d]=%p fmt=%d usage=%#x",
                 dbgSourceStr(source), pslot, mProducerBuffers[pslot].get(),
                 mProducerBuffers[pslot]->getPixelFormat(),