OSDN Git Service

drm_hwcomposer: Free failed composition in QueueComposition
authorSean Paul <seanpaul@chromium.org>
Fri, 10 Jul 2015 20:43:06 +0000 (16:43 -0400)
committerSean Paul <seanpaul@chromium.org>
Sat, 11 Jul 2015 02:30:29 +0000 (22:30 -0400)
Rather than maintaining ownership of the composition in the
caller, free the DrmComposition in QueueComposition on failure.

Change-Id: Id70e98ae1a8eef400bc29460bfc5a89c4707d617
Signed-off-by: Sean Paul <seanpaul@chromium.org>
compositor.h
drmcompositor.cpp
hwcomposer.cpp

index e148416..b424b37 100644 (file)
@@ -90,6 +90,8 @@ class Compositor {
   // Starts a fresh composition.
   virtual Composition *CreateComposition(Importer *importer) = 0;
 
+  // Transfers ownership of composition to the Compositor (whether or not this
+  // call returns success) for compositing.
   // On success returns a syncpoint fd that will be signaled when composition is
   // complete or -1 if compositing was completed by this method's return. On
   // error returns an integer less than -1. The composition is invalid after
index 4268ab5..9ade368 100644 (file)
@@ -71,6 +71,7 @@ int DrmCompositor::QueueComposition(Composition *composition) {
         drm_composition->TakeDisplayComposition(display));
     if (ret) {
       ALOGE("Failed to queue composition for display %d", display);
+      delete composition;
       return ret;
     }
   }
index 02c13af..b4fb340 100644 (file)
@@ -407,9 +407,10 @@ static int hwc_set(hwc_composer_device_1_t *dev, size_t num_displays,
   }
 
   ret = ctx->drm.compositor()->QueueComposition(composition);
+  composition = NULL;
   if (ret) {
     ALOGE("Failed to queue the composition");
-    hwc_set_cleanup(num_displays, display_contents, composition);
+    hwc_set_cleanup(num_displays, display_contents, NULL);
     return ret;
   }
   hwc_set_cleanup(num_displays, display_contents, NULL);