aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Salido <salidoa@google.com>2016-10-03 19:29:15 +0000
committerandroid-build-merger <android-build-merger@google.com>2016-10-03 19:29:15 +0000
commit3af111cf5975e51318b8aa59f39e5d96c6bc3fbd (patch)
treefdac63686ade130497740f45ceb37b9ee2cf882c
parentb38dbf65e012488d45a17507c0a761b2a1380def (diff)
parentff717ff5b00180242041c0bd74d4e26dcfb2d260 (diff)
downloaddrm_hwcomposer-3af111cf5975e51318b8aa59f39e5d96c6bc3fbd.tar.gz
drm_hwcomposer: limit maximum depth of frame worker queue
am: ff717ff5b0 Change-Id: I89614273f61428a5303586c0fd63bdc4a53e3e63
-rw-r--r--drmdisplaycompositor.cpp10
1 files changed, 10 insertions, 0 deletions
diff --git a/drmdisplaycompositor.cpp b/drmdisplaycompositor.cpp
index 92323b6..5da9152 100644
--- a/drmdisplaycompositor.cpp
+++ b/drmdisplaycompositor.cpp
@@ -191,6 +191,16 @@ int DrmDisplayCompositor::FrameWorker::Init() {
void DrmDisplayCompositor::FrameWorker::QueueFrame(
std::unique_ptr<DrmDisplayComposition> composition, int status) {
Lock();
+
+ // Block queue if it gets too large. Otherwise composition will
+ // start stacking up and eat limited resources (file descriptors)
+ // allocated for these.
+ while (frame_queue_.size() >= DRM_DISPLAY_COMPOSITOR_MAX_QUEUE_DEPTH) {
+ Unlock();
+ sched_yield();
+ Lock();
+ }
+
FrameState frame;
frame.composition = std::move(composition);
frame.status = status;