Fix unexpected FrameEvents on BufferQueue reconnect
Helps reduce the number of ALOGE's being hit
when switching between apps.
* Notify Layer when the Producer disconnects.
* Avoid sending event deltas from a previous connection.
* Avoid releasing a frame more than once.
Test: adb shell /data/nativetest/libgui_test/libgui_test
--gtest_filter=*GetFrameTimestamps*
Change-Id: I64f314be72ddb154b584d726ac382cd468e345bf
diff --git a/services/surfaceflinger/SurfaceFlingerConsumer.cpp b/services/surfaceflinger/SurfaceFlingerConsumer.cpp
index 942af13..bb1ff06 100644
--- a/services/surfaceflinger/SurfaceFlingerConsumer.cpp
+++ b/services/surfaceflinger/SurfaceFlingerConsumer.cpp
@@ -211,11 +211,11 @@
}
}
-void SurfaceFlingerConsumer::releasePendingBuffer()
+bool SurfaceFlingerConsumer::releasePendingBuffer()
{
if (!mPendingRelease.isPending) {
ALOGV("Pending buffer already released");
- return;
+ return false;
}
ALOGV("Releasing pending buffer");
Mutex::Autolock lock(mMutex);
@@ -225,6 +225,7 @@
ALOGE_IF(result != NO_ERROR, "releasePendingBuffer failed: %s (%d)",
strerror(-result), result);
mPendingRelease = PendingRelease();
+ return true;
}
#endif
@@ -261,6 +262,13 @@
}
}
+void SurfaceFlingerConsumer::onDisconnect() {
+ sp<Layer> l = mLayer.promote();
+ if (l.get()) {
+ l->onDisconnect();
+ }
+}
+
void SurfaceFlingerConsumer::addAndGetFrameTimestamps(
const NewFrameEventsEntry* newTimestamps,
FrameEventHistoryDelta *outDelta) {