For more information on how FIFO packets work in the Fuchsia tracing system, see Fuchsia tracing system.
FIFO packets are fixed size with the following format:
typedef struct trace_provider_packet { // One of TRACE_PROVIDER_*. uint16_t request; // For alignment and future concerns, must be zero. uint16_t reserved; // Optional data for the request. // The contents depend on the request. // If unused they must be passed as zero. uint32_t data32; uint64_t data64; } trace_provider_packet_t;
The following FIFO packets are defined for the Fuchsia tracing system:
This packet is sent from trace providers to the trace manager. Notifies the trace manager that the provider has received the “start tracing” request and is starting to collect trace data. The data32
field of the packet contains the version number of the FIFO protocol that the provider is using. The value is specified by TRACE_PROVIDER_FIFO_PROTOCOL_VERSION
in //zircon/system/ulib/trace-provider/include/lib/trace-provider/provider.h
. If the trace manager sees a protocol it doesn't understand, it closes its side of the FIFO and ignores all trace data from the provider.
Note: This request is only used in streaming mode.
This packet is sent from trace providers to the trace manager in streaming mode. Notifies the trace manager that a buffer is full and needs saving. The data32
field contains the wrap count, which is the number of times writing has switched from one buffer to the next. The buffer that needs saving is (data32 & 1)
. The data64
field contains the offset of the end of data written to the durable buffer.
Only one buffer save request may be sent at a time. The next one cannot be sent until TRACE_PROVIDER_BUFFER_SAVED
is received acknowledging the previous request.
This packet is sent from the trace manager to trace providers in streaming mode. Notifies the trace provider that the requested buffer has been saved. The data32
and data64
fields must have the same values from the originating TRACE_PROVIDER_SAVE_BUFFER
request.