| # 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. | 
 |  |