From 9ec430adaea1cb88eaa1e78c7f759cd42ab6cf7a Mon Sep 17 00:00:00 2001 From: Mathias Agopian Date: Tue, 6 Oct 2009 19:00:57 -0700 Subject: fix [2152536] ANR in browser A window is created and the browser is about to render into it the very first time, at that point it does an IPC to SF to request a new buffer. Meanwhile, the window manager removes that window from the list and the shared memory block it uses is marked as invalid. However, at that point, another window is created and is given the same index (that just go freed), but a different identity and resets the "invalid" bit in the shared block. When we go back to the buffer allocation code, we're stuck because the surface we're allocating for is gone and we don't detect it's invalid because the invalid bit has been reset. It is not sufficient to check for the invalid bit, I should also check that identities match. --- libs/ui/SharedBufferStack.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'libs/ui/SharedBufferStack.cpp') diff --git a/libs/ui/SharedBufferStack.cpp b/libs/ui/SharedBufferStack.cpp index 47c596c5c2..b460757414 100644 --- a/libs/ui/SharedBufferStack.cpp +++ b/libs/ui/SharedBufferStack.cpp @@ -97,10 +97,10 @@ Region SharedBufferStack::getDirtyRegion(int buffer) const // ---------------------------------------------------------------------------- SharedBufferBase::SharedBufferBase(SharedClient* sharedClient, - int surface, int num) + int surface, int num, int32_t identity) : mSharedClient(sharedClient), mSharedStack(sharedClient->surfaces + surface), - mNumBuffers(num) + mNumBuffers(num), mIdentity(identity) { } @@ -248,8 +248,8 @@ ssize_t SharedBufferServer::StatusUpdate::operator()() { // ============================================================================ SharedBufferClient::SharedBufferClient(SharedClient* sharedClient, - int surface, int num) - : SharedBufferBase(sharedClient, surface, num), tail(0) + int surface, int num, int32_t identity) + : SharedBufferBase(sharedClient, surface, num, identity), tail(0) { tail = computeTail(); } @@ -353,7 +353,7 @@ status_t SharedBufferClient::setDirtyRegion(int buffer, const Region& reg) SharedBufferServer::SharedBufferServer(SharedClient* sharedClient, int surface, int num, int32_t identity) - : SharedBufferBase(sharedClient, surface, num) + : SharedBufferBase(sharedClient, surface, num, identity) { mSharedStack->init(identity); mSharedStack->head = num-1; -- cgit v1.2.3-59-g8ed1b