.. _module-pw_malloc:

=========
pw_malloc
=========
This module defines an interface for replacing the standard libc dynamic memory
operations.

This facade doesn't implement any heap structure or dynamic memory methods. It
only requires that backends implements ``pw::malloc::GetSystemAllocator`` and
optionally ``pw::malloc::InitSystemAllocator``. These functions are called
before static initialization, and are responsible for initializing global data
structures required by the ``malloc`` implementation.

The intent of this module is to provide an interface for user-provided dynamic
memory operations that is compatible with different implementations.

-----
Setup
-----
This module requires the following setup:

1. Choose a ``pw_malloc`` backend, or write one yourself.
2. Select a backend in your build system. If using GN build, Specify the
   ``pw_malloc_BACKEND`` GN build arg to point to the library that provides a
   ``pw_malloc`` backend. If using the Bazel build, add the constraint value for
   the backend library that provides a ``pw_malloc`` backend.
3. Add a dependency on the ``pw_malloc`` facade in your targets ``executable``
   build template, e.g.:

.. code-block::

   template("platform_executable") {
      target("executable", target_name) {
         deps = []
         config = []
         forward_variables_from(invoker, "*")
         if (pw_malloc_BACKEND != "") {
            deps += [ dir_pw_malloc ]
         }
      }
   }

Compile-time configuration
==========================
This module has configuration options that globally affect the behavior of
``pw_malloc`` via compile-time configuration of this module.

.. doxygendefine:: PW_MALLOC_LOCK_TYPE
.. doxygendefine:: PW_MALLOC_METRICS_TYPE
.. doxygendefine:: PW_MALLOC_BLOCK_OFFSET_TYPE
.. doxygendefine:: PW_MALLOC_BLOCK_POISON_INTERVAL
.. doxygendefine:: PW_MALLOC_BLOCK_ALIGNMENT
.. doxygendefine:: PW_MALLOC_MIN_BUCKET_SIZE
.. doxygendefine:: PW_MALLOC_NUM_BUCKETS
.. doxygendefine:: PW_MALLOC_DUAL_FIRST_FIT_THRESHOLD

See the
:ref:`module documentation <module-structure-compile-time-configuration>` for
more details.

Heap initialization
===================
You can provide a region of memory to use as heap as either a byte span or a
pair of addresses to ``pw::malloc::InitSystemAllocator``.

-----
Usage
-----
Once the heap is initialized, you may simply use ``malloc`` and ``free`` as you
would normally, as well as standard library functions like ``strdup`` and
built-in routines like ``new`` that use those functions.

If you configured a ``PW_MALLOC_METRICS_TYPE``, you can retrieve metrics using
``pw::malloc::GetSystemMetrics()``.

.. toctree::
   :maxdepth: 1
   :hidden:

   Backends <backends>
