summaryrefslogtreecommitdiff
path: root/libs/ui/SharedBufferStack.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
commit0b3ad46a26dc3717260fa9347c77f673f3198606 (patch)
treee101cea80b6258fa478b702cfef622747f3f9e39 /libs/ui/SharedBufferStack.cpp
parentc91af0c12e24d56262a2c100d9e46de26b33fb91 (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/SharedBufferStack.cpp')
-rw-r--r--libs/ui/SharedBufferStack.cpp13
1 files changed, 10 insertions, 3 deletions
diff --git a/libs/ui/SharedBufferStack.cpp b/libs/ui/SharedBufferStack.cpp
index 9ad4349da2..47c596c5c2 100644
--- a/libs/ui/SharedBufferStack.cpp
+++ b/libs/ui/SharedBufferStack.cpp
@@ -114,6 +114,12 @@ uint32_t SharedBufferBase::getIdentity()
return stack.identity;
}
+status_t SharedBufferBase::getStatus() const
+{
+ SharedBufferStack& stack( *mSharedStack );
+ return stack.status;
+}
+
size_t SharedBufferBase::getFrontBuffer() const
{
SharedBufferStack& stack( *mSharedStack );
@@ -135,7 +141,6 @@ String8 SharedBufferBase::dump(char const* prefix) const
return result;
}
-
// ============================================================================
// conditions and updates
// ============================================================================
@@ -375,8 +380,10 @@ status_t SharedBufferServer::unlock(int buffer)
void SharedBufferServer::setStatus(status_t status)
{
- StatusUpdate update(this, status);
- updateCondition( update );
+ if (status < NO_ERROR) {
+ StatusUpdate update(this, status);
+ updateCondition( update );
+ }
}
status_t SharedBufferServer::reallocate()