OSDN Git Service

Avoid file descriptor leak of acquire fence for client target
authorlambdadroid <lambdadroid@gmail.com>
Wed, 16 Jan 2019 17:53:12 +0000 (18:53 +0100)
committerlambdadroid <lambdadroid@gmail.com>
Wed, 16 Jan 2019 17:53:12 +0000 (18:53 +0100)
In most cases, the fence was closed in presentDisplay(). However,
presentDisplay() is not necessarily called after setClientTarget().
This changes mAcquireFence to a base::unique_fd to make sure the
previous one is always closed before a new one is assigned.

DrmComposer.cpp
DrmComposerHal.h

index 450448d..bd6fe67 100644 (file)
@@ -267,7 +267,7 @@ Error DrmComposerHal::setClientTarget(Display /*displayId*/,
         buffer_handle_t target, int32_t acquireFence,
         int32_t /*dataspace*/, const std::vector<hwc_rect_t>& /*damage*/) {
     mBuffer = target;
-    mAcquireFence = acquireFence;
+    mAcquireFence.reset(acquireFence);
     return Error::NONE;
 }
 
@@ -308,7 +308,7 @@ Error DrmComposerHal::presentDisplay(Display displayId, int32_t* /*outPresentFen
 
     if (mAcquireFence >= 0) {
         sync_wait(mAcquireFence, -1);
-        close(mAcquireFence);
+        mAcquireFence.reset();
     }
 
     display->present(mBuffer);
index 0d6fe27..1527672 100644 (file)
@@ -4,6 +4,7 @@
 #pragma once
 
 #include <unordered_map>
+#include <android-base/unique_fd.h>
 #include <composer-hal/2.1/ComposerHal.h>
 #include "DrmDevice.h"
 
@@ -105,7 +106,7 @@ private:
 
     // The next client target buffer to be displayed
     buffer_handle_t mBuffer = nullptr;
-    int mAcquireFence;
+    base::unique_fd mAcquireFence;
 };
 
 }  // namespace drmfb