diff options
author | Steve Pfetsch <spfetsch@google.com> | 2016-09-29 17:16:29 -0700 |
---|---|---|
committer | Steve Pfetsch <spfetsch@google.com> | 2016-10-18 18:36:25 -0700 |
commit | 1d3df546d5ee4dcc9e7cae6f8b8b790f741539af (patch) | |
tree | a1a723f5eda7794819643431ba5fb8742e9bece5 | |
parent | f920891b71cbd33c96e7e44231524ee0b8e83760 (diff) | |
download | native-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.cpp | 17 |
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 */) { |