blob: 9a6504f9de8fa0ab96774243869f5cd294ad2385 [file]
.. _module-pw_multibuf:
===========
pw_multibuf
===========
.. pigweed-module::
:name: pw_multibuf
Many forms of device I/O, including sending or receiving messages via RPC,
transfer, or sockets, need to deal with multiple buffers or a series of
intermediate buffers, each requiring their own copy of the data. ``pw_multibuf``
allows data to be written *once*, eliminating the memory, CPU and latency
overhead of copying, and aggregates the memory regions in a manner
that is:
- **Flexible**: Memory regions can be discontiguous and have different ownership
semantics. Memory regions can be added and removed with few restrictions.
- **Copy-averse**: Users can pass around and mutate MultiBuf instances without
copying or moving data in-memory.
- **Compact**: The sequence of memory regions and details about them are stored
in only a few words of additional metadata.
.. literalinclude:: examples/basic.cc
:language: cpp
:linenos:
:start-after: [pw_multibuf-examples-basic]
:end-before: [pw_multibuf-examples-basic]
For the complete example, see :cs:`pw_multibuf/examples/basic.cc`.
-------------------------------
What kinds of data is this for?
-------------------------------
``pw_multibuf`` is best used in code that wants to read, write, or pass along
data which are one or more of the following:
- **Large**: The MultiBuf type allows breaking up data into multiple chunks.
- **Heterogeneous**: MultiBuf instances allow combining data that is uniquely
owned, shared, or externally managed, and encapsulates the details of
deallocating the memory it owns.
- **Latency-sensitive**: Since they are copy-averse, MultiBuf instances are
useful when working in systems that need to pass large amounts of data, or
when memory usage is constrained.
- **Discontiguous**: MultiBuf instances provide an interface to accessing and
modifying memory regions that encapsulates where the memory actually resides.
- **Communications-oriented**: Data which is being received or sent across
sockets, various packets, or shared-memory protocols can benefit from the
fragmentation, multiplexing, and layering features of the MultiBuf type.
.. toctree::
:hidden:
:maxdepth: 1
guide
concepts
design
code_size
.. grid:: 3
.. grid-item-card:: :octicon:`rocket` Examples
:link: module-pw_multibuf-guide
:link-type: ref
:class-item: sales-pitch-cta-primary
Learn how to use pw_multibuf through a series of examples
.. grid-item-card:: :octicon:`light-bulb` Concepts
:link: module-pw_multibuf-concepts
:link-type: ref
:class-item: sales-pitch-cta-secondary
Explore the ideas behind pw_multibuf
.. grid-item-card:: :octicon:`pencil` Design
:link: module-pw_multibuf-design
:link-type: ref
:class-item: sales-pitch-cta-secondary
Learn why pw_multibuf is designed the way it is
.. grid:: 3
.. grid-item-card:: :octicon:`code` API reference
:link: ../api/cc/group__pw__multibuf__v2.html
:link-type: url
:class-item: sales-pitch-cta-secondary
Detailed description of pw_multibuf's current API
.. grid-item-card:: :octicon:`code-square` Legacy API
:link: ../api/cc/group__pw__multibuf__v1.html
:link-type: url
:class-item: sales-pitch-cta-secondary
Detailed description of pw_multibuf's legacy API
.. grid-item-card:: :octicon:`beaker` Code size analysis
:link: module-pw_multibuf-size-reports
:link-type: ref
:class-item: sales-pitch-cta-secondary
Understand pw_multibuf's code and memory footprint