From 0c4cec7e4df87181486d280c98fba9c0f4774c37 Mon Sep 17 00:00:00 2001 From: Mathias Agopian Date: Fri, 2 Oct 2009 18:12:30 -0700 Subject: Attempt to fix [2152536] ANR in browser The ANR is caused by SurfaceFlinger waiting for buffers of a removed surface to become availlable. When it is removed from the current list, a Surface is marked as NO_INIT, which causes SF to return immediately in the above case. For some reason, the surface here wasn't marked as NO_INIT. This change makes the code more robust by always (irregadless or errors) setting the NO_INIT status in all code paths where a surface is removed from the list. Additionaly added more information in the logs, should this happen again. --- libs/surfaceflinger/SurfaceFlinger.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'libs/surfaceflinger/SurfaceFlinger.cpp') diff --git a/libs/surfaceflinger/SurfaceFlinger.cpp b/libs/surfaceflinger/SurfaceFlinger.cpp index eb0983a..f2b918f 100644 --- a/libs/surfaceflinger/SurfaceFlinger.cpp +++ b/libs/surfaceflinger/SurfaceFlinger.cpp @@ -1073,6 +1073,8 @@ status_t SurfaceFlinger::purgatorizeLayer_l(const sp& layerBase) // remove the layer from the main list (through a transaction). ssize_t err = removeLayer_l(layerBase); + layerBase->onRemoved(); + // it's possible that we don't find a layer, because it might // have been destroyed already -- this is not technically an error // from the user because there is a race between BClient::destroySurface(), @@ -1321,7 +1323,6 @@ status_t SurfaceFlinger::removeSurface(SurfaceID index) if (layer != 0) { err = purgatorizeLayer_l(layer); if (err == NO_ERROR) { - layer->onRemoved(); setTransactionFlags(eTransactionNeeded); } } -- cgit v1.1