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.
diff --git a/include/private/ui/SharedBufferStack.h b/include/private/ui/SharedBufferStack.h
index c02b2e7..59cf31c 100644
--- a/include/private/ui/SharedBufferStack.h
+++ b/include/private/ui/SharedBufferStack.h
@@ -142,6 +142,7 @@
SharedBufferBase(SharedClient* sharedClient, int surface, int num);
~SharedBufferBase();
uint32_t getIdentity();
+ status_t getStatus() const;
size_t getFrontBuffer() const;
String8 dump(char const* prefix) const;
@@ -177,7 +178,7 @@
{
const SharedBufferStack& stack( *mSharedStack );
SharedClient& client( *mSharedClient );
- const nsecs_t TIMEOUT = s2ns(1);
+ const nsecs_t TIMEOUT = s2ns(1);
Mutex::Autolock _l(client.lock);
while ((condition()==false) && (stack.status == NO_ERROR)) {
status_t err = client.cv.waitRelative(client.lock, TIMEOUT);
@@ -187,14 +188,15 @@
if (err == TIMED_OUT) {
if (condition()) {
LOGE("waitForCondition(%s) timed out (identity=%d), "
- "but condition is true! We recovered but it "
- "shouldn't happen." ,
- T::name(), mSharedStack->identity);
+ "but condition is true! We recovered but it "
+ "shouldn't happen." , T::name(),
+ mSharedStack->identity);
break;
} else {
- LOGW("waitForCondition(%s) timed out (identity=%d). "
- "CPU may be pegged. trying again.",
- T::name(), mSharedStack->identity);
+ LOGW("waitForCondition(%s) timed out "
+ "(identity=%d, status=%d). "
+ "CPU may be pegged. trying again.", T::name(),
+ mSharedStack->identity, mSharedStack->status);
}
} else {
LOGE("waitForCondition(%s) error (%s) ",