Fix some FD lifecycle issues

Use unique_fd, it's cool

Bug: 186919605
Test: make, guessing from a pretty clear error message & documentation
Change-Id: Ied546565261708b7e4c2d220dce6d6a89725cc06
diff --git a/libs/hwui/renderthread/VulkanSurface.cpp b/libs/hwui/renderthread/VulkanSurface.cpp
index 474d2cc..c559425 100644
--- a/libs/hwui/renderthread/VulkanSurface.cpp
+++ b/libs/hwui/renderthread/VulkanSurface.cpp
@@ -329,20 +329,16 @@
 
         if (bufferInfo.buffer.get() != nullptr && bufferInfo.dequeued) {
             int err = mNativeWindow->cancelBuffer(mNativeWindow.get(), bufferInfo.buffer.get(),
-                                                  bufferInfo.dequeue_fence);
+                                                  bufferInfo.dequeue_fence.release());
             if (err != 0) {
                 ALOGE("cancelBuffer[%u] failed during destroy: %s (%d)", i, strerror(-err), err);
             }
             bufferInfo.dequeued = false;
-
-            if (bufferInfo.dequeue_fence >= 0) {
-                close(bufferInfo.dequeue_fence);
-                bufferInfo.dequeue_fence = -1;
-            }
+            bufferInfo.dequeue_fence.reset();
         }
 
         LOG_ALWAYS_FATAL_IF(bufferInfo.dequeued);
-        LOG_ALWAYS_FATAL_IF(bufferInfo.dequeue_fence != -1);
+        LOG_ALWAYS_FATAL_IF(bufferInfo.dequeue_fence.ok());
 
         bufferInfo.skSurface.reset();
         bufferInfo.buffer.clear();
@@ -365,8 +361,12 @@
     // Since auto pre-rotation is enabled, dequeueBuffer to get the consumer driven buffer size
     // from ANativeWindowBuffer.
     ANativeWindowBuffer* buffer;
-    int fence_fd;
-    err = mNativeWindow->dequeueBuffer(mNativeWindow.get(), &buffer, &fence_fd);
+    base::unique_fd fence_fd;
+    {
+        int rawFd = -1;
+        err = mNativeWindow->dequeueBuffer(mNativeWindow.get(), &buffer, &rawFd);
+        fence_fd.reset(rawFd);
+    }
     if (err != 0) {
         ALOGE("dequeueBuffer failed: %s (%d)", strerror(-err), err);
         return nullptr;
@@ -387,7 +387,7 @@
             if (err != 0) {
                 ALOGE("native_window_set_buffers_transform(%d) failed: %s (%d)", transformHint,
                       strerror(-err), err);
-                mNativeWindow->cancelBuffer(mNativeWindow.get(), buffer, fence_fd);
+                mNativeWindow->cancelBuffer(mNativeWindow.get(), buffer, fence_fd.release());
                 return nullptr;
             }
             mWindowInfo.transform = transformHint;
@@ -405,19 +405,19 @@
     for (idx = 0; idx < mWindowInfo.bufferCount; idx++) {
         if (mNativeBuffers[idx].buffer.get() == buffer) {
             mNativeBuffers[idx].dequeued = true;
-            mNativeBuffers[idx].dequeue_fence = fence_fd;
+            mNativeBuffers[idx].dequeue_fence = std::move(fence_fd);
             break;
         } else if (mNativeBuffers[idx].buffer.get() == nullptr) {
             // increasing the number of buffers we have allocated
             mNativeBuffers[idx].buffer = buffer;
             mNativeBuffers[idx].dequeued = true;
-            mNativeBuffers[idx].dequeue_fence = fence_fd;
+            mNativeBuffers[idx].dequeue_fence = std::move(fence_fd);
             break;
         }
     }
     if (idx == mWindowInfo.bufferCount) {
         ALOGE("dequeueBuffer returned unrecognized buffer");
-        mNativeWindow->cancelBuffer(mNativeWindow.get(), buffer, fence_fd);
+        mNativeWindow->cancelBuffer(mNativeWindow.get(), buffer, fence_fd.release());
         return nullptr;
     }
 
@@ -429,7 +429,7 @@
                 kTopLeft_GrSurfaceOrigin, mWindowInfo.colorspace, nullptr);
         if (bufferInfo->skSurface.get() == nullptr) {
             ALOGE("SkSurface::MakeFromAHardwareBuffer failed");
-            mNativeWindow->cancelBuffer(mNativeWindow.get(), buffer, fence_fd);
+            mNativeWindow->cancelBuffer(mNativeWindow.get(), buffer, fence_fd.release());
             return nullptr;
         }
     }
@@ -460,25 +460,23 @@
 
     LOG_ALWAYS_FATAL_IF(!mCurrentBufferInfo);
     VulkanSurface::NativeBufferInfo& currentBuffer = *mCurrentBufferInfo;
-    int queuedFd = (semaphoreFd != -1) ? semaphoreFd : currentBuffer.dequeue_fence;
+    // queueBuffer always closes fence, even on error
+    int queuedFd = (semaphoreFd != -1) ? semaphoreFd : currentBuffer.dequeue_fence.release();
     int err = mNativeWindow->queueBuffer(mNativeWindow.get(), currentBuffer.buffer.get(), queuedFd);
 
     currentBuffer.dequeued = false;
-    // queueBuffer always closes fence, even on error
     if (err != 0) {
         ALOGE("queueBuffer failed: %s (%d)", strerror(-err), err);
+        // cancelBuffer takes ownership of the fence
         mNativeWindow->cancelBuffer(mNativeWindow.get(), currentBuffer.buffer.get(),
-                                    currentBuffer.dequeue_fence);
+                                    currentBuffer.dequeue_fence.release());
     } else {
         currentBuffer.hasValidContents = true;
         currentBuffer.lastPresentedCount = mPresentCount;
         mPresentCount++;
     }
 
-    if (currentBuffer.dequeue_fence >= 0) {
-        close(currentBuffer.dequeue_fence);
-        currentBuffer.dequeue_fence = -1;
-    }
+    currentBuffer.dequeue_fence.reset();
 
     return err == 0;
 }