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

Skip to content
Commit fc0cd258 authored by Kean Mariotti's avatar Kean Mariotti
Browse files

Fix deadlock of main thread and Perfetto thread (LayerDataSource::OnStart)

The deadly embrace used to happen in this situation:
1. Perfetto shmem buffer full.
2. Main thread blocked while writing into shmem buffer (active tracing),
   i.e. main thread waiting for Perfetto thread to signal available
   shmem chunks.
3. LayerDataSource::OnStart with MODE_DUMP (executed by Perfetto thread)
   waiting for main thread to capture a layers snapshot.

This commit removes the capture of layers snapshot in OnStart.
Now OnStop (Perfetto thread) triggers the layers snapshot capture
to be performed by the main thread. However, the Perfetto thread
doesn't wait for the main thread to complete the capture. The actual
stop of the tracing session is deferred and signalled later by the main
thread through LayerDataSource::StopArgs::HandleStopAsynchronously()
when the capture is complete.

Fix: b/313130597
Test: reproduced the issue forcing the main thread to write 100MB into the shmem buffer:

    mLayerTracing.setTakeLayersSnapshotProtoFunction([&](uint32_t traceFlags) {
        auto snapshot = perfetto::protos::LayersSnapshotProto{};
        mScheduler
                ->schedule([&]() FTL_FAKE_GUARD(mStateLock) FTL_FAKE_GUARD(kMainThreadContext) {
                    snapshot = takeLayersSnapshotProto(traceFlags, TimePoint::now(),
                                                       mLastCommittedVsyncId, true);
+                   LayerDataSource::Trace([&](LayerDataSource::TraceContext context) {
+                       auto packet = context.NewTracePacket();
+                       packet->set_timestamp(0);
+                       packet->set_timestamp_clock_id(perfetto::protos::pbzero::BUILTIN_CLOCK_MONOTONIC);
+                       auto* snapshotProto = packet->set_surfaceflinger_layers_snapshot();
+
+                       auto data = std::string(100000000, 0xaa);
+                       snapshotProto->AppendRawProtoBytes(data.data(), data.size());
+                   });
                })
                .wait();
        return snapshot;
    });

Change-Id: Iea253da2a420d186d092521597f4783e5c8d157d
parent 926dbea7
Loading
Loading
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment