summaryrefslogtreecommitdiff
path: root/libs/ui/Surface.cpp
diff options
context:
space:
mode:
author Mathias Agopian <mathias@google.com> 2009-10-02 18:12:30 -0700
committer Mathias Agopian <mathias@google.com> 2009-10-02 18:12:30 -0700
commit0c4cec7e4df87181486d280c98fba9c0f4774c37 (patch)
tree4d3aa4fe0101104a1816af9208d367d588bb4f4d /libs/ui/Surface.cpp
parent7b16834adc1003f492cd2be4b1bcc3fb73a78c23 (diff)
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.
Diffstat (limited to 'libs/ui/Surface.cpp')
-rw-r--r--libs/ui/Surface.cpp8
1 files changed, 5 insertions, 3 deletions
diff --git a/libs/ui/Surface.cpp b/libs/ui/Surface.cpp
index 64522fb6c374..285edb4faca9 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));