summaryrefslogtreecommitdiff
path: root/libs/gui/SurfaceControl.cpp
diff options
context:
space:
mode:
author Jorim Jaggi <jjaggi@google.com> 2018-01-29 16:39:21 +0100
committer Jorim Jaggi <jjaggi@google.com> 2018-01-29 17:53:43 +0100
commit0b26710528eb69f3883f295f3e6146e6466fd082 (patch)
treec576cb43ac8109983131874f18057124b386d99e /libs/gui/SurfaceControl.cpp
parent246bd9b6ab1e7c07d5779e325dd35c4c82745380 (diff)
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!
Diffstat (limited to 'libs/gui/SurfaceControl.cpp')
-rw-r--r--libs/gui/SurfaceControl.cpp13
1 files changed, 9 insertions, 4 deletions
diff --git a/libs/gui/SurfaceControl.cpp b/libs/gui/SurfaceControl.cpp
index f5fb8acf44..5eafbb3555 100644
--- a/libs/gui/SurfaceControl.cpp
+++ b/libs/gui/SurfaceControl.cpp
@@ -48,8 +48,9 @@ namespace android {
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 @@ SurfaceControl::~SurfaceControl()
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<SurfaceControl> SurfaceControl::readFromParcel(Parcel* parcel)
}
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 */);
}
// ----------------------------------------------------------------------------