etl/docs/IO/buffer_descriptors.md
John Wellbelove 4a88884b39
Issue/add hugo support for documentation (#1449)
* Add ranges

* Initial Hugo setup

* Work in progress

* Added selection for local or remote site

* Updated to 'light' theme

* Changed to using Hextra Hugo theme

* Changed to using Hextra Hugo theme

* Changed to Hextra Hugo theme

* Change to Hextra Hugo theme

* Updated Hugo setup.

* Updated Hugo setup.

# Conflicts:
#	docs/releases/_index.md

* Work in progress

* Added new fonts

Added new documentation

* Latest documentation updates

* Latest documentation updates

# Conflicts:
#	docs/containers/array.md
#	docs/containers/array_view.md
#	docs/containers/array_wrapper.md
#	docs/containers/bip_buffer_spsc_atomic.md
#	docs/containers/bitset.md
#	docs/containers/indirect_vector.md
#	docs/containers/vector.md
#	docs/getting-started/compilers.md

* Added bloom_filter markdown doc

* Added more documentation

Updated CSS for light and dark modes

* Fixed some menus

Added mode documentation files

* Updated CSS rules

Added badges to home page
Added uniqur_ptr + pool tutorial

* Fixed formatting on the home page markdown

Modified light amd dark code formatting

* Updated unique_ptr-with-pool

* Added container and shared message tutorials

* Updates to documentation

* Added const_multimap

* Updated source-formatting.md

* Added initial raw text files form Web site editor

* Innore coverage build directory

* Exported raw text documentation files from the web site editor

* Hugo updates

* Added Hugo intalation and markdown descriptions

* More addition to the documentation

* Added closure.md and updates to delegate.md

* Added format.md

* Added documentation for etl::delegate_observable, etl::function, Base64 codec

* Added io_port documentation

* Added basic_format_spec

* Added documentation for string_stream and string utilities.

* Added more documentation

Updated the documentation CSS

* Added documentation for clocks, day, duration

* Added more documentation for chrono classes

Updated callouts

* More chrono documentation

* Completed chrono documentation

* Maths functions documentation

* Completed maths documentation

* Completed maths documentation

* Completed maths documentation

* Completed maths documentation

* Added multiple documentation files

* Added iterator.md

* Added debug_count.md and versions.md

* Added debug_count.md and versions.md

* Added more documentation

* More documentation

* Added some design pattern documentation

Modified some of the layout files
Modified the About documentation

* Converted more documentation pages

Modified the site CSS

* Added more documentation

Moced some documentation files to new directories

* Added more documentation

Tweaks to CSS

* Added callback_timer_deferred_locked documentation

* Added callback_timer_locked documentation

* More documentation updates

* More documentation updates

* More documentation updates

* New documentation files.

Harmonised file name format

* New documentation files.

* Multiple document updates

* Multiple document updates

* Final conversion of web pages

* Updates before PR

* Updates before PR

* Updates before PR

# Conflicts:
#	docs/blog/_index.md

* Final pre PR updates

* Updates to message framework documentation

* Renamed directory

* Fix spelling

* Added author and date to blog files

Moved documentation files merged from development

* Fixed 'Description' typo

* Fix typos

# Conflicts:
#	docs/IO/io_port.md
#	docs/containers/sets/const-multiset.md
#	docs/containers/sets/const-set.md
#	docs/maths/correlation.md
#	docs/maths/gamma.md

* Renamed two files to lower case

* Minor renaming

* Added author and date

* Updated callout on bresenham_line.md

Added support for showing the ETL version on the documentation first page, by copying the version.txt file as a hugo asset.
Updated the Python 'update_release.py' to copy 'version.txt'

* Replace space in filename with hyphen.

Added more information to hugo-commands.md

* Replace space in filename with hyphen.

Added more information to hugo-commands.md

# Conflicts:
#	docs/getting-started/view-the-docs-locally/hugo-commands.md

* Added a link to pseudo_moving_average.md

* Updated title pages for groups

* Fixed missing 404 for non-existent pages

* Fixed coordinate variable names in the 'Calculating the intersection' example

---------

Co-authored-by: Roland Reichwein <Roland.Reichwein@bmw.de>
Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.com>
Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.co.uk>
2026-06-06 13:12:44 +01:00

6.1 KiB

title
buffer_descriptors

{{< callout >}} Header: buffer_descriptors.h
Since: All versions
{{< /callout >}}

A set of descriptors to a collection of buffers.

template <typename TBuffer,      // The type to store in the buffer.
          TSize    BUFFER_SIZE,  // The size of each buffer.
          size_t   N_BUFFERS,    // The total number of buffers.
          typename TFlag = bool> // The 'in use' flag type.
class buffer_descriptors

The type used for the 'in use' flag depends on how the buffer descriptors class is used. For interrupts and multi-threaded code, either the flag type must force a fence (by using an atomic type) or the calls to allocate and release must ensure that they are not re-ordered by the compiler or processor.

Member types

Type
value_type The type that is stored in the buffers
size_type An unsigned integral type
flag_type
pointer
descriptor A nested class that encapsulates the details of an individual buffer
notification A nested class that is sent to the user defined callback function
callback_type etl::delegate<void(notification)>

Static Constants

Value
N_BUFFERS The number of buffers that the buffer descriptor controls
BUFFER_SIZE The number of elements in each buffer

Constructors

buffer_descriptors(pointer pbuffers)

Description
Construct with a pointer to the start of the buffers to control. This storage should be contiguous and large enough to hold N_BUFFERS.


buffer_descriptors(pointer pbuffers, const callback_type& callback)

Description
Construct with a pointer to the start of the buffers to control and the callback.

Member functions

void set_callback(const callback_type& callback)

Description
Set the callback for notification.


bool is_valid() const

Description
Returns true if class contains valid buffers.


void notify(notification n)

Description
Calls the user defined callback with the descriptor and buffer size. Used when the buffer has been filled and is ready for processing via the callback.


descriptor allocate()

Description
Returns a new descriptor. If all descriptors are in use then the descriptor will be invalid.


descriptor allocate(value_type fill)

Description
Returns a new descriptor and fills the buffer with fill. If all descriptors are in use then the descriptor will be invalid.


void clear()

Description
Clears by releasing all allocated descriptors.

descriptor

Description
A nested class that encapsulates the details of an individual buffer.


const size_type MAX_SIZE

Description
The maximum size of the buffer.


descriptor()

Description
Default constructor.


ETL_CONSTEXPR pointer data() const

Description
Returns a pointer to the start of the buffer.


ETL_CONSTEXPR size_type max_size() const

Description
Returns the maximum size of the buffer.


bool is_valid() const

Description
Returns true if the descriptor points to a valid buffer.


bool is_allocated() const

Description
Returns true if the descriptor has been allocated.


bool is_released() const

Description
Returns true if the descriptor has been released.


void release()

Description
Releases the descriptor.


notification

Description
A nested class that is sent to the user defined callback function.


notification()

Description
Default contructor. Initialises to a default constructed descriptor and a count of zero.


notification(descriptor desc, size_t count)

Description
Construct with the supplied parameters.


descriptor get_descriptor() const

Description
Gets the descriptor.


size_t get_count() const

Description
Gets the count.

Example

Very simplified.
Assumes that there is a DMA driver class called DMA.
In the real world the descriptor would be queued in the callback and handled in a foreground thread.
The handler in the thread would release the descriptor.

constexpr size_t BUFFER_SIZE = 256U;
constexpr size_t N_BUFFERS   = 8U;

// Define the buffer descriptors type.
using BD = etl::buffer_descriptors<char, BUFFER_SIZE, N_BUFFERS, std::atomic_char>;

// The buffers to use with it.
char buffers[N_BUFFERS][BUFFER_SIZE];

// The function to call when a buffer is ready.
void Callback(BD::notification notification)
{
  // Process the buffer in the descriptor here.
  ProcessData(notification.get_descriptor().data(), notification.get_count());

  // Finished with the descriptor now, so release it back.
  notification.get_descriptor().release();
}

// Create the buffer_descriptors.
BD bd(&buffers[0][0], BD::callback_type::create<Callback>());

// The current dma descriptor.
BD::descriptor dma_descriptor;

// An object that controls the DMA.
DMA dma;

// Call to start the DMA.
void DMAStart()
{
  // Get a new descriptor.
  dma_descriptor = bd.allocate();

  if (dma_descriptor.is_valid())
  {
    // Link the buffer to the DMA channel.
    dma.Start(dma_descriptor.data());
  }
  else
  {
    // No valid descriptors available.
    LogError("No Descriptor Available");
  }
}

// Called when the DMA has completed (usually an interrupt).
void DMAComplete()
{
  // DMA is complete. Notify the callback.
  bd.notify(BD::notification(dma_descriptor, dma.GetTransferredSize()));
}