From d7e7f90d93cc754d8ff0181297ae6cd39ffae74f Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Tue, 6 Jan 2026 00:17:13 -0500 Subject: [PATCH] xo-arena: annex ArenaConfig.*pp from xo-alloc2/ --- include/xo/arena/ArenaConfig.hpp | 70 ++++++++++++++++++++++++++++++++ src/arena/ArenaConfig.cpp | 18 ++++++++ src/arena/CMakeLists.txt | 1 + 3 files changed, 89 insertions(+) create mode 100644 include/xo/arena/ArenaConfig.hpp create mode 100644 src/arena/ArenaConfig.cpp diff --git a/include/xo/arena/ArenaConfig.hpp b/include/xo/arena/ArenaConfig.hpp new file mode 100644 index 0000000..7d3f347 --- /dev/null +++ b/include/xo/arena/ArenaConfig.hpp @@ -0,0 +1,70 @@ +/** @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 */ diff --git a/src/arena/ArenaConfig.cpp b/src/arena/ArenaConfig.cpp new file mode 100644 index 0000000..d08feb4 --- /dev/null +++ b/src/arena/ArenaConfig.cpp @@ -0,0 +1,18 @@ +/** @file ArenaConfig.cpp + * + * @author Roland Conybeare, Dec 2025 + **/ + +#include "ArenaConfig.hpp" + +namespace xo { + namespace mm { + ArenaConfig + ArenaConfig::simple(std::size_t z) + { + return ArenaConfig { .name_ = "anonymous", .size_ = z }; + } + } +} + +/* end ArenaConfig.cpp */ diff --git a/src/arena/CMakeLists.txt b/src/arena/CMakeLists.txt index 9a12405..345e9cc 100644 --- a/src/arena/CMakeLists.txt +++ b/src/arena/CMakeLists.txt @@ -4,6 +4,7 @@ set(SELF_LIB xo_arena) set(SELF_SRCS AllocError.cpp AllocInfo.cpp + ArenaConfig.cpp ) xo_add_shared_library4(${SELF_LIB} ${PROJECT_NAME}Targets ${PROJECT_VERSION} 1 ${SELF_SRCS})