Merge "drm_hwcomposer: limit maximum depth of display composition queue" into mnc-dr-dev
diff --git a/drmdisplaycompositor.cpp b/drmdisplaycompositor.cpp
index c923526..b293681 100644
--- a/drmdisplaycompositor.cpp
+++ b/drmdisplaycompositor.cpp
@@ -25,6 +25,7 @@
 
 #include <algorithm>
 #include <pthread.h>
+#include <sched.h>
 #include <sstream>
 #include <stdlib.h>
 #include <time.h>
@@ -35,6 +36,8 @@
 #include <sync/sync.h>
 #include <utils/Trace.h>
 
+#define DRM_DISPLAY_COMPOSITOR_MAX_QUEUE_DEPTH 3
+
 namespace android {
 
 DrmDisplayCompositor::DrmDisplayCompositor()
@@ -122,6 +125,14 @@
     return ret;
   }
 
+  // Block the queue if it gets too large. Otherwise, SurfaceFlinger will start
+  // to eat our buffer handles when we get about 1 second behind.
+  while (composite_queue_.size() >= DRM_DISPLAY_COMPOSITOR_MAX_QUEUE_DEPTH) {
+    pthread_mutex_unlock(&lock_);
+    sched_yield();
+    pthread_mutex_lock(&lock_);
+  }
+
   composite_queue_.push(std::move(composition));
 
   ret = pthread_mutex_unlock(&lock_);