aboutsummaryrefslogtreecommitdiff
path: root/pw_allocator/docs.rst
diff options
context:
space:
mode:
Diffstat (limited to 'pw_allocator/docs.rst')
-rw-r--r--pw_allocator/docs.rst81
1 files changed, 63 insertions, 18 deletions
diff --git a/pw_allocator/docs.rst b/pw_allocator/docs.rst
index 81dcb06cf..0d5545ccf 100644
--- a/pw_allocator/docs.rst
+++ b/pw_allocator/docs.rst
@@ -7,19 +7,58 @@ pw_allocator
This module provides various building blocks
for a dynamic allocator. This is composed of the following parts:
-- ``block``: An implementation of a linked list of memory blocks, supporting
- splitting and merging of blocks.
+- ``block``: An implementation of a doubly-linked list of memory blocks,
+ supporting splitting and merging of blocks.
- ``freelist``: A freelist, suitable for fast lookups of available memory chunks
(i.e. ``block`` s).
-
-Heap Integrity Check
-====================
-The ``Block`` class provides two check functions:
-
-- ``bool Block::IsValid()``: Returns ``true`` is the given block is valid and
- ``false`` otherwise.
-- ``void Block::CrashIfInvalid()``: Crash the program and output the reason why
- the check fails using ``PW_DCHECK``.
+- ``allocator``: An interface for memory allocators. Several concrete
+ implementations are also provided.
+
+Block
+=====
+.. doxygenclass:: pw::allocator::Block
+ :members:
+
+FreeList
+========
+.. doxygenclass:: pw::allocator::FreeList
+ :members:
+
+Allocator
+=========
+.. doxygenclass:: pw::allocator::Allocator
+ :members:
+
+Example
+-------
+As an example, the following implements a simple allocator that tracks memory
+using ``Block``.
+
+.. literalinclude:: public/pw_allocator/simple_allocator.h
+ :language: cpp
+ :linenos:
+ :start-after: [pw_allocator_examples_simple_allocator]
+ :end-before: [pw_allocator_examples_simple_allocator]
+
+Other Implemetations
+--------------------
+Provided implementations of the ``Allocator`` interface include:
+
+- ``AllocatorMetricProxy``: Wraps another allocator and records its usage.
+- ``FallbackAllocator``: Dispatches first to a primary allocator, and, if that
+ fails, to a secondary alloator.
+- ``LibCAllocator``: Uses ``malloc``, ``realloc``, and ``free``. This should
+ only be used if the ``libc`` in use provides those functions.
+- ``NullAllocator``: Always fails. This may be useful if allocations should be
+ disallowed under specific circumstances.
+- ``SplitFreeListAllocator``: Tracks memory using ``Block``, and splits large
+ and small allocations between the front and back, respectively, of it memory
+ region in order to reduce fragmentation.
+
+UniquePtr
+=========
+.. doxygenclass:: pw::allocator::UniquePtr
+ :members:
Heap Poisoning
==============
@@ -28,7 +67,7 @@ By default, this module disables heap poisoning since it requires extra space.
User can enable heap poisoning by enabling the ``pw_allocator_POISON_HEAP``
build arg.
-.. code:: sh
+.. code-block:: sh
$ gn args out
# Modify and save the args file to use heap poison.
@@ -57,7 +96,7 @@ Usage
The heap visualizer can be launched from a shell using the Pigweed environment.
-.. code:: sh
+.. code-block:: sh
$ pw heap-viewer --dump-file <directory of dump file> --heap-low-address
<hex address of heap lower address> --heap-high-address <hex address of heap
@@ -71,7 +110,7 @@ The required arguments are:
represented as ``f <memory address>``. For example, a dump file should look
like:
- .. code:: sh
+ .. code-block:: sh
m 20 0x20004450 # malloc 20 bytes, the pointer is 0x20004450
m 8 0x2000447c # malloc 8 bytes, the pointer is 0x2000447c
@@ -82,13 +121,13 @@ The required arguments are:
- ``--heap-low-address`` is the start of the heap. For example:
- .. code:: sh
+ .. code-block:: sh
--heap-low-address 0x20004440
- ``--heap-high-address`` is the end of the heap. For example:
- .. code:: sh
+ .. code-block:: sh
--heap-high-address 0x20006040
@@ -101,5 +140,11 @@ Options include the following:
- ``--pointer-size <integer of pointer size>``: The size of a pointer on the
machine where ``malloc/free`` is called. The default value is ``4``.
-Note, this module, and its documentation, is currently incomplete and
-experimental.
+.. _module-pw_allocator-size:
+
+Size report
+===========
+``pw_allocator`` provides some of its own implementations of the ``Allocator``
+interface, whos costs are shown below.
+
+.. include:: allocator_size_report