Fix issue with Surface loss
Some remote animations didn't use all surfaces, meaning that these
became unreachable objects in the object tree, meaning that they
we're finalized during the animation, causing the leash to be
destroyed in SurfaceFlinger, causing to suffering because the
AWT surface got released, meaning that we can never allocate the
main windows Surface anymore.
Fix this by not releasing surfaces that you don't own.
Test: go/wm-smoke
Test: Notification launch animation over app
Change-Id: Ia99b4e814bfb286ae1d3639c525fc8f6c42c0e0f
Fixes: No bug yet, but expect to have a chaselist bug soon!
diff --git a/libs/gui/SurfaceControl.cpp b/libs/gui/SurfaceControl.cpp
index f5fb8ac..5eafbb3 100644
--- a/libs/gui/SurfaceControl.cpp
+++ b/libs/gui/SurfaceControl.cpp
@@ -48,8 +48,9 @@
SurfaceControl::SurfaceControl(
const sp<SurfaceComposerClient>& client,
const sp<IBinder>& handle,
- const sp<IGraphicBufferProducer>& gbp)
- : mClient(client), mHandle(handle), mGraphicBufferProducer(gbp)
+ const sp<IGraphicBufferProducer>& gbp,
+ bool owned)
+ : mClient(client), mHandle(handle), mGraphicBufferProducer(gbp), mOwned(owned)
{
}
@@ -60,7 +61,9 @@
void SurfaceControl::destroy()
{
- if (isValid()) {
+ // Avoid destroying the server-side surface if we are not the owner of it, meaning that we
+ // retrieved it from another process.
+ if (isValid() && mOwned) {
mClient->destroySurface(mHandle);
}
// clear all references and trigger an IPC now, to make sure things
@@ -184,9 +187,11 @@
}
sp<IBinder> gbp;
parcel->readNullableStrongBinder(&gbp);
+
+ // We aren't the original owner of the surface.
return new SurfaceControl(new SurfaceComposerClient(
interface_cast<ISurfaceComposerClient>(client)),
- handle.get(), interface_cast<IGraphicBufferProducer>(gbp));
+ handle.get(), interface_cast<IGraphicBufferProducer>(gbp), false /* owned */);
}
// ----------------------------------------------------------------------------