From cbaa4c90f8a321ff34769fe6d5e01580bb37c358 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Tue, 12 Aug 2025 13:14:01 -0500 Subject: [PATCH] xo-alloc: alter GC to use LinearAlloc directly - retire ListAlloc --- CMakeLists.txt | 2 +- xo-alloc/include/xo/alloc/ArenaAlloc.hpp | 11 ++++++++--- xo-alloc/include/xo/alloc/GC.hpp | 18 +++++++++--------- xo-alloc/src/alloc/GC.cpp | 24 ++++++++++++------------ 4 files changed, 30 insertions(+), 25 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 33047d8e..1534cb88 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -85,11 +85,11 @@ add_subdirectory(xo-pyreflect) add_subdirectory(xo-ratio) add_subdirectory(xo-unit) add_subdirectory(xo-pyunit) +add_subdirectory(xo-callback) # add_subdirectory(xo-alloc) add_subdirectory(xo-object) # -add_subdirectory(xo-callback) add_subdirectory(xo-webutil) add_subdirectory(xo-pywebutil) add_subdirectory(xo-printjson) diff --git a/xo-alloc/include/xo/alloc/ArenaAlloc.hpp b/xo-alloc/include/xo/alloc/ArenaAlloc.hpp index 63de43e8..64546cf3 100644 --- a/xo-alloc/include/xo/alloc/ArenaAlloc.hpp +++ b/xo-alloc/include/xo/alloc/ArenaAlloc.hpp @@ -28,15 +28,20 @@ namespace xo { ArenaAlloc(ArenaAlloc &&) = delete; ~ArenaAlloc(); - /** create allocator with capacity @p z, + /** Create allocator with capacity @p z, + * Reserve memory addresses for @p z bytes, + * but don't commit them until needed **/ static up make(const std::string & name, - std::size_t z, - bool debug_flag); + std::size_t z, + bool debug_flag); std::byte * free_ptr() const { return free_ptr_; } void set_free_ptr(std::byte * x); + /** Reset to empty state **/ + void reset(std::size_t /*z_ignored*/) { this->clear(); } + void capture_object_statistics(capture_phase phase, ObjectStatistics * p_dest) const; diff --git a/xo-alloc/include/xo/alloc/GC.hpp b/xo-alloc/include/xo/alloc/GC.hpp index 64cf198d..a653b54b 100644 --- a/xo-alloc/include/xo/alloc/GC.hpp +++ b/xo-alloc/include/xo/alloc/GC.hpp @@ -5,7 +5,7 @@ #pragma once -#include "ListAlloc.hpp" +#include "ArenaAlloc.hpp" #include "GcStatistics.hpp" #include "xo/callback/UpCallbackSet.hpp" #include "xo/indentlog/print/array.hpp" @@ -240,14 +240,14 @@ namespace xo { virtual std::byte * alloc_gc_copy(std::size_t z, const void * src) final override; private: - ListAlloc * nursery_to() const { return nursery(role::to_space); } - ListAlloc * nursery_from() const { return nursery(role::from_space); } + ArenaAlloc * nursery_to() const { return nursery(role::to_space); } + ArenaAlloc * nursery_from() const { return nursery(role::from_space); } - ListAlloc * tenured_to() const { return tenured(role::to_space); } - ListAlloc * tenured_from() const { return tenured(role::from_space); } + ArenaAlloc * tenured_to() const { return tenured(role::to_space); } + ArenaAlloc * tenured_from() const { return tenured(role::from_space); } - ListAlloc * nursery(role r) const { return nursery_[role2int(r)].get(); } - ListAlloc * tenured(role r) const { return tenured_[role2int(r)].get(); } + ArenaAlloc * nursery(role r) const { return nursery_[role2int(r)].get(); } + ArenaAlloc * tenured(role r) const { return tenured_[role2int(r)].get(); } MutationLog * mutation_log(role r) const { return mutation_log_[role2int(r)].get(); } @@ -314,11 +314,11 @@ namespace xo { /** contains allocated objects, along with unreachable garbage to be collected. * roles reverse after each incremental, or full, collection. **/ - std::array, role2int(role::N)> nursery_; + std::array, role2int(role::N)> nursery_; /** empty space, destination for objects that survive collection. * roles reverse after each full collection. **/ - std::array, role2int(role::N)> tenured_; + std::array, role2int(role::N)> tenured_; /** current state of GC activity. * @text diff --git a/xo-alloc/src/alloc/GC.cpp b/xo-alloc/src/alloc/GC.cpp index d0aaa660..6ccc4d15 100644 --- a/xo-alloc/src/alloc/GC.cpp +++ b/xo-alloc/src/alloc/GC.cpp @@ -66,14 +66,14 @@ namespace xo { std::size_t tenured_size = config.initial_tenured_z_; nursery_[role2int(role::from_space)] - = ListAlloc::make("NA", nursery_size, 2 * nursery_size, config.debug_flag_); + = ArenaAlloc::make("NA", nursery_size, config.debug_flag_); nursery_[role2int(role::to_space) ] - = ListAlloc::make("NB", nursery_size, 2 * nursery_size, config.debug_flag_); + = ArenaAlloc::make("NB", nursery_size, config.debug_flag_); tenured_[role2int(role::from_space)] - = ListAlloc::make("TA", tenured_size, 2 * tenured_size, config.debug_flag_); + = ArenaAlloc::make("TA", tenured_size, config.debug_flag_); tenured_[role2int(role::to_space) ] - = ListAlloc::make("TB", tenured_size, 2 * tenured_size, config.debug_flag_); + = ArenaAlloc::make("TB", tenured_size, config.debug_flag_); mutation_log_[role2int(role::from_space)] = std::make_unique(); mutation_log_[role2int(role::to_space)] = std::make_unique(); @@ -444,7 +444,7 @@ namespace xo { void GC::swap_nursery() { - up tmp = std::move(nursery_[role2int(role::to_space)]); + up tmp = std::move(nursery_[role2int(role::to_space)]); nursery_[role2int(role::to_space)] = std::move(nursery_[role2int(role::from_space)]); nursery_[role2int(role::from_space)] = std::move(tmp); } @@ -452,7 +452,7 @@ namespace xo { void GC::swap_tenured() { - up tmp = std::move(tenured_[role2int(role::to_space)]); + up tmp = std::move(tenured_[role2int(role::to_space)]); tenured_[role2int(role::to_space)] = std::move(tenured_[role2int(role::from_space)]); tenured_[role2int(role::from_space)] = std::move(tmp); } @@ -496,9 +496,9 @@ namespace xo { log && log(xtag("avail_tenured_z", avail_tenured_z)); if (avail_tenured_z < max_promote_z) { - ListAlloc * tenured_to = this->tenured_to(); + ArenaAlloc * tenured_to = this->tenured_to(); - tenured_to->expand(max_promote_z, tenured_to->name() + "+"); + tenured_to->expand(max_promote_z); } } @@ -516,13 +516,13 @@ namespace xo { this->swap_mutation_log(); - ListAlloc * N_from = nursery(role::from_space); + ArenaAlloc * N_from = nursery(role::from_space); log && log(xtag("nursery.from", N_from->name()), xtag("size", N_from->size())); - ListAlloc * N_to = nursery(role::to_space); + ArenaAlloc * N_to = nursery(role::to_space); log && log(xtag("nursery.to", N_to->name()), xtag("size", N_to->size())); - ListAlloc * T_from = tenured(role::from_space); + ArenaAlloc * T_from = tenured(role::from_space); log && log(xtag("tenured.from", T_from->name()), xtag("size", T_from->size())); - ListAlloc * T_to = tenured(role::to_space); + ArenaAlloc * T_to = tenured(role::to_space); log && log(xtag("tenured.to", T_to->name()), xtag("size", T_to->size())); } /*swap_spaces*/