blob: 0f50e82933c0e848c363cc606f944a804e672202 [file] [log] [blame] [view]
# Tracing provider buffering modes
In tracing, the buffering mode is the behavior of a trace provider when
it fills its buffer. If a trace provider's buffer fills while a trace is
running, you may get an incomplete trace.
The behavior of each trace provider is independent of other trace providers.
If one trace provider fills its buffer, other trace providers can still
continue to record trace events into their own buffers until the trace stops.
There are three buffering modes:
* [Oneshot](#oneshot)
* [Circular](#circular)
* [Streaming](#streaming)
For information on the `BufferingMode` for the `fuchsia.tracing.provider`
FIDL, see
[`BufferingMode`](https://fuchsia.dev/reference/fidl/fuchsia.tracing.provider#BufferingMode).
## Oneshot {#oneshot}
In this buffer mode, there is a single durable buffer. If the buffer of the
tracing provider becomes full, then that trace provider stops recording events.
## Circular {#circular}
In this buffer mode, the trace buffer is divided into three pieces, the durable
buffer and two rolling buffers. The durable buffer is for records important
enough that they should not be lost. These include records for thread and
string references.
When you start a trace, the tracing provider writes data to the first rolling
buffer. Once one rolling buffer fills, the tracing provider writes data to
the other rolling buffer.
If the durable buffer fills, then tracing for the tracing provider stops.
This behavior does not affect other tracing providers.
## Streaming {#streaming}
In this buffer mode, the trace buffer is divided into three pieces, the durable
buffer and two rolling buffers. The durable buffer is for records important
enough that they should not be lost. These include records for thread and
string references.
When you start a trace, the tracing provider writes data to the first rolling
buffer. Once one rolling buffer fills, the tracing provider notifies the
trace manager that one rolling buffer is full and writes data to the other
rolling buffer. If the other rolling buffer is not available, then data is
dropped until the rolling buffer becomes available. A rolling buffer becomes
unavailable between the point when it is filled and when the trace manager
reports back that the buffer's contents have been saved.
The possibility of dropped data depends on the rate at which the tracing
provider creates records and the rate at which the trace manager can save
the buffers. Dropped data can result in a partially incomplete trace, but
in most cases this is more desirable than affecting program performance by
waiting for a buffer to be saved.
If the durable buffer fills, then tracing for the tracing provider stops.
This behavior does not affect other tracing providers.