diff options
Diffstat (limited to 'services/surfaceflinger/SurfaceFlinger.cpp')
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 7a31a1528c..62c9f25da3 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -2534,14 +2534,7 @@ status_t SurfaceFlinger::addClientLayer(const sp<Client>& client, return NO_ERROR; } -status_t SurfaceFlinger::removeLayer(const wp<Layer>& weakLayer) { - Mutex::Autolock _l(mStateLock); - sp<Layer> layer = weakLayer.promote(); - if (layer == nullptr) { - // The layer has already been removed, carry on - return NO_ERROR; - } - +status_t SurfaceFlinger::removeLayer(const sp<Layer>& layer) { const auto& p = layer->getParent(); const ssize_t index = (p != nullptr) ? p->removeChild(layer) : mCurrentState.layersSortedByZ.remove(layer); @@ -2824,6 +2817,9 @@ uint32_t SurfaceFlinger::setClientStateLocked( flags |= eTransactionNeeded|eTraversalNeeded; } } + if (what & layer_state_t::eDetachChildren) { + layer->detachChildren(); + } if (what & layer_state_t::eOverrideScalingModeChanged) { layer->setOverrideScalingMode(s.overrideScalingMode); // We don't trigger a traversal here because if no other state is @@ -2920,7 +2916,7 @@ status_t SurfaceFlinger::createDimLayer(const sp<Client>& client, status_t SurfaceFlinger::onLayerRemoved(const sp<Client>& client, const sp<IBinder>& handle) { - // called by the window manager when it wants to remove a Layer + // called by a client when it wants to remove a Layer status_t err = NO_ERROR; sp<Layer> l(client->getLayerUser(handle)); if (l != NULL) { @@ -2936,7 +2932,15 @@ status_t SurfaceFlinger::onLayerDestroyed(const wp<Layer>& layer) { // called by ~LayerCleaner() when all references to the IBinder (handle) // are gone - return removeLayer(layer); + sp<Layer> l = layer.promote(); + if (l == nullptr) { + // The layer has already been removed, carry on + return NO_ERROR; + } if (l->getParent() != nullptr) { + // If we have a parent, then we can continue to live as long as it does. + return NO_ERROR; + } + return removeLayer(l); } // --------------------------------------------------------------------------- |