summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Pfetsch <spfetsch@google.com>2016-09-29 17:16:29 -0700
committerSteve Pfetsch <spfetsch@google.com>2016-10-18 18:36:25 -0700
commit1d3df546d5ee4dcc9e7cae6f8b8b790f741539af (patch)
treea1a723f5eda7794819643431ba5fb8742e9bece5
parentf920891b71cbd33c96e7e44231524ee0b8e83760 (diff)
downloadnative-1d3df546d5ee4dcc9e7cae6f8b8b790f741539af.tar.gz
services: surfaceflinger: ASAN fix
Move layer removal to the main thread, while the display is on. Bug: 30281222 Change-Id: Id9f956c1e626819734868340e7fa12abf257b702
-rw-r--r--services/surfaceflinger/SurfaceFlinger.cpp17
1 files changed, 8 insertions, 9 deletions
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 8db071ed2f..db52d40214 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -1768,9 +1768,12 @@ void SurfaceFlinger::updateCursorAsync()
void SurfaceFlinger::commitTransaction()
{
- if (!mLayersPendingRemoval.isEmpty()) {
+ sp<const DisplayDevice> hw = getDefaultDisplayDevice();
+
+ if (!mLayersPendingRemoval.isEmpty() && hw->isDisplayOn()) {
// Notify removed layers now that they can't be drawn from
for (size_t i = 0; i < mLayersPendingRemoval.size(); i++) {
+ mCurrentState.layersSortedByZ.remove(mLayersPendingRemoval[i]);
recordBufferingStats(mLayersPendingRemoval[i]->getName().string(),
mLayersPendingRemoval[i]->getOccupancyHistory(true));
mLayersPendingRemoval[i]->onRemoved();
@@ -2217,14 +2220,10 @@ status_t SurfaceFlinger::removeLayer(const wp<Layer>& weakLayer) {
return NO_ERROR;
}
- ssize_t index = mCurrentState.layersSortedByZ.remove(layer);
- if (index >= 0) {
- mLayersPendingRemoval.push(layer);
- mLayersRemoved = true;
- setTransactionFlags(eTransactionNeeded);
- return NO_ERROR;
- }
- return status_t(index);
+ mLayersPendingRemoval.push(layer);
+ mLayersRemoved = true;
+ setTransactionFlags(eTransactionNeeded);
+ return NO_ERROR;
}
uint32_t SurfaceFlinger::peekTransactionFlags(uint32_t /* flags */) {