Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 954766c3 authored by Vishnu Nair's avatar Vishnu Nair Committed by Android Build Coastguard Worker
Browse files

Fix crash when a layer is destroyed immediately after creation

If a layer handle is destroyed before we commit any transactions, we
will  not be able to promote the legacy layer object in the main thread. This
is a few of the remaining warts with the legacy frontend which we can fixed
once we remove the flag. For now, fix this by checking if the layer was
destroyed before accessing the legacy layer object.

Test: presubmit
Fixes: 318347070
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:1009dbdbbf28c891d70d9d125b081b3df4c5849d)
Merged-In: Ia54feb4b483f0981acd198a0af07745cec183863
Change-Id: Ia54feb4b483f0981acd198a0af07745cec183863
parent 592fc698
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -2436,6 +2436,13 @@ bool SurfaceFlinger::updateLayerSnapshots(VsyncId vsyncId, nsecs_t frameTimeNs,
            const bool willReleaseBufferOnLatch = layer->willReleaseBufferOnLatch();

            auto it = mLegacyLayers.find(layer->id);
            if (it == mLegacyLayers.end() &&
                layer->changes.test(frontend::RequestedLayerState::Changes::Destroyed)) {
                // Layer handle was created and immediately destroyed. It was destroyed before it
                // was added to the map.
                continue;
            }

            LLOG_ALWAYS_FATAL_WITH_TRACE_IF(it == mLegacyLayers.end(),
                                            "Couldnt find layer object for %s",
                                            layer->getDebugString().c_str());
+9 −0
Original line number Diff line number Diff line
@@ -213,6 +213,15 @@ TEST_F(LayerTransactionTest, CommitCallbackCalledOnce) {
    ASSERT_EQ(callCount, 1);
}

TEST_F(LayerTransactionTest, AddRemoveLayers) {
    for (int i = 0; i < 100; i++) {
        sp<SurfaceControl> layer;
        ASSERT_NO_FATAL_FAILURE(
                layer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceBufferState));
        layer.clear();
    }
}

} // namespace android

// TODO(b/129481165): remove the #pragma below and fix conversion issues