Using Circular Buffers#
Circular buffers can sometimes be used to minimize the overhead of
allocating and freeing the items passed between pipeline filters. If the
first filter to create an item and last filter to consume an item are
both serial_in_order
, the items can be allocated and freed via a
circular buffer of size at least ntoken
, where ntoken
is the
first parameter to parallel_pipeline
. Under these conditions, no
checking of whether an item is still in use is necessary.
The reason this works is that at most ntoken
items can be in flight,
and items will be freed in the order that they were allocated. Hence by
the time the circular buffer wraps around to reallocate an item, the
item must have been freed from its previous use in the pipeline. If the
first and last filter are not serial_in_order
, then you have to
keep track of which buffers are currently in use, because buffers might
not be retired in the same order they were allocated.