summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMathias Agopian <mathias@google.com>2012-01-12 16:13:54 -0800
committerMathias Agopian <mathias@google.com>2012-01-12 16:13:54 -0800
commit87c6ea6eedbe920774e55175e921b229c4f74cc8 (patch)
tree7787bb5346646a57e1bfd5102cbdf0d68e7c0ad1
parent2fdc357bc66b97614455c5148562a5dfb650c1b7 (diff)
downloadframeworks_base-87c6ea6eedbe920774e55175e921b229c4f74cc8.zip
frameworks_base-87c6ea6eedbe920774e55175e921b229c4f74cc8.tar.gz
frameworks_base-87c6ea6eedbe920774e55175e921b229c4f74cc8.tar.bz2
fix a bug with vsync management
this bug was introduced recently. we were signaling *all* clients regardless of the vsync rate. Change-Id: I2ae8a6c820a390f602382596ba75e8ed737fb2ef
-rw-r--r--services/surfaceflinger/EventThread.cpp15
1 files changed, 7 insertions, 8 deletions
diff --git a/services/surfaceflinger/EventThread.cpp b/services/surfaceflinger/EventThread.cpp
index 035836e..80ab519 100644
--- a/services/surfaceflinger/EventThread.cpp
+++ b/services/surfaceflinger/EventThread.cpp
@@ -102,7 +102,7 @@ bool EventThread::threadLoop() {
nsecs_t timestamp;
DisplayEventReceiver::Event vsync;
- KeyedVector< wp<DisplayEventConnection>, ConnectionInfo > displayEventConnections;
+ Vector< wp<DisplayEventConnection> > displayEventConnections;
{ // scope for the lock
Mutex::Autolock _l(mLock);
@@ -153,6 +153,9 @@ bool EventThread::threadLoop() {
}
info.count--;
}
+ if (reportVsync) {
+ displayEventConnections.add(mDisplayEventConnections.keyAt(i));
+ }
}
if (reportVsync) {
@@ -164,15 +167,11 @@ bool EventThread::threadLoop() {
vsync.header.type = DisplayEventReceiver::DISPLAY_EVENT_VSYNC;
vsync.header.timestamp = timestamp;
vsync.vsync.count = mDeliveredEvents;
-
- // make a copy of our connection list, so we can
- // dispatch events without holding mLock
- displayEventConnections = mDisplayEventConnections;
}
const size_t count = displayEventConnections.size();
for (size_t i=0 ; i<count ; i++) {
- sp<DisplayEventConnection> conn(displayEventConnections.keyAt(i).promote());
+ sp<DisplayEventConnection> conn(displayEventConnections[i].promote());
// make sure the connection didn't die
if (conn != NULL) {
status_t err = conn->postEvent(vsync);
@@ -186,12 +185,12 @@ bool EventThread::threadLoop() {
// handle any other error on the pipe as fatal. the only
// reasonable thing to do is to clean-up this connection.
// The most common error we'll get here is -EPIPE.
- removeDisplayEventConnection(displayEventConnections.keyAt(i));
+ removeDisplayEventConnection(displayEventConnections[i]);
}
} else {
// somehow the connection is dead, but we still have it in our list
// just clean the list.
- removeDisplayEventConnection(displayEventConnections.keyAt(i));
+ removeDisplayEventConnection(displayEventConnections[i]);
}
}