# Life of a Perfetto tracing session

This document explains how producer, service and consumer interact end-to-end
during a tracing session, with references to code and IPC requests / responses.

1.  One or more producers connect to the tracing service and sets up their IPC
    channels.
2.  Each producer advertises one or more data sources through the
    [`RegisterDataSource`](/protos/perfetto/ipc/producer_port.proto#34) IPC.
    Nothing more happens on the Producer until this point. Nothing traces by
    default.
3.  A consumer connects to the tracing service and sets up the IPC channel.
4.  The consumer starts a tracing session sending a
    [trace config](/docs/concepts/config.md) to the service through the
    [`EnableTracing`](/protos/perfetto/ipc/consumer_port.proto#65) IPC.
6.  The service creates as many new trace buffers as specified in the config.
7.  The service iterates through the
    [`data_sources`](/protos/perfetto/config/trace_config.proto#50) section of
    the trace config: for each entry, if a matching data source is found in the
    producer(s) (accordingly to what advertised in step 2):
8.  The service sends a
    [`SetupTracing`](/protos/perfetto/ipc/producer_port.proto#112) IPC message,
    passing a shared memory buffer  to the producer(s) (only once for each
    producer).
9.  The service sends a
    [`StartDataSource`](/protos/perfetto/ipc/producer_port.proto#105) IPC message
    to each producer, for each data source configured in the trace config and
    present in the producer (if any).
10. The producer creates one or more data source instance, as instructed in
    the previous step.
11. Each data source instance creates one or more
    [`TraceWriter`](/include/perfetto/ext/tracing/core/trace_writer.h) (typically
    one for each thread).
12. Each `TraceWriter` writes one or more
    [`TracePacket`](/protos/perfetto/trace/trace_packet.proto).
13. While doing so, each `TraceWriter` takes ownership of shared memory buffer's
    chunks, using the [`SharedMemoryArbiter`](/include/perfetto/ext/tracing/core/shared_memory_arbiter.h).
14. While writing a `TracePacket`, the `TraceWriter` will unavoidably cross the
    chunk boundary (typically 4KB, but can configured to be smaller).
15. When this happens the `TraceWriter` will release the current chunk and
    acquire a new chunk through the `SharedMemoryArbiter`.
16. The `SharedMemoryArbiter` will, out-of-band, send a
    [`CommitDataRequest`](/protos/perfetto/ipc/producer_port.proto#41) to the
    service, requesting it to move some chunks of the shared memory buffer into
    the final trace buffer.
17. If one or more long `TracePacket` were fragmented over several chunks, it is
    possible that some of these chunks are gone from the shared memory
    buffer and committed into the final trace buffer (step 16). In this case,
    the `SharedMemoryArbiter` will send an other `CommitDataRequest` IPC message
    to request the out-of-band patching of the chunk data into the final trace
    buffer.
18. The service will check if the given chunk, identified by the tuple
    `{ProducerID (unspoofable), WriterID, ChunkID}` is still present in the
    trace buffer and if so will proceed to patch it (% checks).
19. The consumer sends a [`FlushRequest`](/protos/perfetto/ipc/consumer_port.proto#52)
    to the service, asking it commit all data on flight in the trace buffers.
20. The service, in turn, issues a
    [`Flush`](/protos/perfetto/ipc/producer_port.proto#132) request to all
    producers involved in the trace session.
21. The producer(s) will `Flush()` all their `TraceWriter` and reply to the
    service flush request.
22. Once the service has received an ACK to all flush requests from all
    producers (or the
    [flush timeout](/protos/perfetto/ipc/consumer_port.proto#117) has expired)
    it replies to the consumer's `FlushRequest`
23. The consumer optionally sends a
    [`DisableTracing`](/protos/perfetto/ipc/consumer_port.proto#38) IPC request
    to stop tracing and freeze the content of the trace buffers.
24. The service will in turn broadcast a
    [`StopDataSource`](/protos/perfetto/ipc/producer_port.proto#110) request for
    each data source in each Producer.
23. At this point the Consumer issues a
    [`ReadBuffers`](/protos/perfetto/ipc/consumer_port.proto#41) IPC request
    (unless it did previously pass a file descriptor to the service when
    enabling the trace through the `write_into_file` field of the trace config).
24. The service reads the trace buffers and streams all the `TracePacket(s)`
    back to the consumer.
25. If a trace packet stored in the trace buffer is incomplete (e.g., a fragment
    is missing) or is marked as pending out-of-band patching, the given writer
    sequence is interrupted and no more packets for that sequence are read.
    Other packets for other `TraceWriter` sequences will be unaffected.
26. The consumer sends a `FreeBuffers` (or simply disconnects).
27. The service tears down all the trace buffers for the session.
