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

Commit 1009dbdb authored by Vishnu Nair's avatar Vishnu Nair
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
Change-Id: Ia54feb4b483f0981acd198a0af07745cec183863
parent 07116b95
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -2449,6 +2449,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