/** @file ArenaConfig.hpp * * @author Roland Conybeare, Dec 2025 **/ #pragma once #include #include namespace xo { namespace mm { /** @class ArenaConfig * @brief configuration for a @ref DArena instance **/ struct ArenaConfig { /** @defgroup mm-arenaconfig-ctors ArenaConfig ctors **/ ///@{ /** create anonymous arena with size @p z **/ static ArenaConfig simple(std::size_t z); ///@} /** @defgroup mm-arenaconfig-instance-vars ArenaConfig members **/ ///@{ /** optional name, for diagnostics **/ std::string name_; /** desired arena size -- hard max = reserved virtual memory **/ std::size_t size_; /** hugepage size -- using huge pages relieves some TLB pressure * (provided you use their full extent :) **/ std::size_t hugepage_z_ = 2 * 1024 * 1024; /** if non-zero, allocate extra space between allocs, and fill * with fixed test-pattern contents. Allows for simple * runtime arena sanitizing checks. * Will be rounded up to multiple of @ref padding::c_alloc_alignment **/ std::size_t guard_z_ = 0; /** if guard_z_ > 0, write at least that many copies * of this guard byte following each complete allocation **/ std::uint8_t guard_byte_ = 0xfd; /** if store_header_flag_ is true: mask bits for allocation size. * remaining bits can be stolen for other purposes * otherwise ignored **/ /** true to store header (8 bytes) at the beginning of each allocation. * necessary and sufficient to allows iterating over allocs * present in arena **/ bool store_header_flag_ = false; /** mask applied to 8-byte alloc header. * bits set to 1 store alloc size; remaining * bits in alloc header can be used for other purposes. **/ std::uint64_t header_size_mask_ = 0xffffffff; /** true to enable debug logging **/ bool debug_flag_ = false; ///@} }; } /*namespace mm*/ } /*namespace xo*/ /* end ArenaConfig.hpp */