diff options
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 |
commit | 0b3ad46a26dc3717260fa9347c77f673f3198606 (patch) | |
tree | e101cea80b6258fa478b702cfef622747f3f9e39 /include/private/ui | |
parent | c91af0c12e24d56262a2c100d9e46de26b33fb91 (diff) | |
download | frameworks_native-0b3ad46a26dc3717260fa9347c77f673f3198606.zip frameworks_native-0b3ad46a26dc3717260fa9347c77f673f3198606.tar.gz frameworks_native-0b3ad46a26dc3717260fa9347c77f673f3198606.tar.bz2 |
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 'include/private/ui')
-rw-r--r-- | include/private/ui/SharedBufferStack.h | 16 |
1 files changed, 9 insertions, 7 deletions
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 @@ public: 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 @@ status_t SharedBufferBase::waitForCondition(T condition) { 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 @@ status_t SharedBufferBase::waitForCondition(T condition) 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) ", |