From 0b3ad46a26dc3717260fa9347c77f673f3198606 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/LayerBase.h | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'libs/surfaceflinger/LayerBase.h') diff --git a/libs/surfaceflinger/LayerBase.h b/libs/surfaceflinger/LayerBase.h index 16ee542246..0dfa4fe862 100644 --- a/libs/surfaceflinger/LayerBase.h +++ b/libs/surfaceflinger/LayerBase.h @@ -205,10 +205,13 @@ public: */ virtual bool isSecure() const { return false; } - /** signal this layer that it's not needed any longer. called from the - * main thread */ + /** Called from the main thread, when the surface is removed from the + * draw list */ virtual status_t ditch() { return NO_ERROR; } + /** called with the state lock when the surface is removed from the + * current list */ + virtual void onRemoved() { }; enum { // flags for doTransaction() @@ -318,7 +321,7 @@ public: sp getSurface(); virtual sp createSurface() const; - virtual void onRemoved() { } + virtual void onRemoved(); class Surface : public BnSurface { -- cgit v1.2.3-59-g8ed1b