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/ui/Surface.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'libs/ui/Surface.cpp') diff --git a/libs/ui/Surface.cpp b/libs/ui/Surface.cpp index 64522fb..285edb4 100644 --- a/libs/ui/Surface.cpp +++ b/libs/ui/Surface.cpp @@ -733,9 +733,11 @@ status_t Surface::getBufferLocked(int index, int usage) index, usage); if (buffer != 0) { // this should never happen by construction LOGE_IF(buffer->handle == NULL, - "requestBuffer(%d, %08x) returned a buffer with a null handle", - index, usage); - if (buffer->handle != NULL) { + "Surface (identity=%d) requestBuffer(%d, %08x) returned" + "a buffer with a null handle", mIdentity, index, usage); + err = mSharedBufferClient->getStatus(); + LOGE_IF(err, "Surface (identity=%d) state = %d", mIdentity, err); + if (!err && buffer->handle != NULL) { err = getBufferMapper().registerBuffer(buffer->handle); LOGW_IF(err, "registerBuffer(...) failed %d (%s)", err, strerror(-err)); -- cgit v1.1