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_);