From 0496bd12e65b6c03cc98c526d6be27bbe898c120 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Sun, 14 Dec 2025 16:58:58 -0500 Subject: [PATCH] xo-alloc2: header reorg + DX1Collector utest --- include/xo/alloc2/AAllocator.hpp | 49 +--------------- include/xo/alloc2/ACollector.hpp | 60 -------------------- include/xo/alloc2/AGCObject.hpp | 54 ------------------ include/xo/alloc2/ArenaConfig.hpp | 1 + include/xo/alloc2/DArena.hpp | 13 +++++ include/xo/alloc2/DCollector.hpp | 84 ---------------------------- include/xo/alloc2/ICollector_Any.hpp | 51 ----------------- include/xo/alloc2/IGCObject_Any.hpp | 48 ---------------- include/xo/alloc2/IGCObject_Xfer.hpp | 62 -------------------- include/xo/alloc2/RCollector.hpp | 51 ----------------- include/xo/alloc2/RCollector_Any.hpp | 51 ----------------- include/xo/alloc2/RGCObject.hpp | 47 ---------------- include/xo/alloc2/gc/generation.hpp | 6 +- include/xo/alloc2/gc/role.hpp | 29 +++++----- src/alloc2/CMakeLists.txt | 4 +- src/alloc2/DArena.cpp | 25 +++++++++ src/alloc2/ICollector_Any.cpp | 2 +- src/alloc2/IGCObject_Any.cpp | 2 +- utest/CMakeLists.txt | 4 +- 19 files changed, 65 insertions(+), 578 deletions(-) delete mode 100644 include/xo/alloc2/ACollector.hpp delete mode 100644 include/xo/alloc2/AGCObject.hpp delete mode 100644 include/xo/alloc2/DCollector.hpp delete mode 100644 include/xo/alloc2/ICollector_Any.hpp delete mode 100644 include/xo/alloc2/IGCObject_Any.hpp delete mode 100644 include/xo/alloc2/IGCObject_Xfer.hpp delete mode 100644 include/xo/alloc2/RCollector.hpp delete mode 100644 include/xo/alloc2/RCollector_Any.hpp delete mode 100644 include/xo/alloc2/RGCObject.hpp diff --git a/include/xo/alloc2/AAllocator.hpp b/include/xo/alloc2/AAllocator.hpp index a0067ee..b553f13 100644 --- a/include/xo/alloc2/AAllocator.hpp +++ b/include/xo/alloc2/AAllocator.hpp @@ -5,6 +5,7 @@ #pragma once +#include "AllocatorError.hpp" #include "xo/facet/facet_implementation.hpp" #include "xo/facet/typeseq.hpp" #include @@ -14,54 +15,6 @@ namespace xo { using Copaque = const void *; using Opaque = void *; - enum class error : int32_t { - /** sentinel **/ - invalid = -1, - /** not an error **/ - none, - /** reserved size exhauged **/ - reserve_exhausted, - /** unable to commit (i.e. mprotect failure) **/ - commit_failed, - /** allocation size too big (See @ref ArenaConfig::header_size_mask_) **/ - header_size_mask, - /** sub_alloc not preceded by super alloc (or another sub_alloc) **/ - orphan_sub_alloc, - }; - - struct AllocatorError { - using size_type = std::size_t; - using value_type = std::byte*; - - AllocatorError() = default; - explicit AllocatorError(error err, - uint32_t seq) : error_{err}, - error_seq_{seq} {} - AllocatorError(error err, - uint32_t seq, - size_type req_z, - size_type com_z, - size_type rsv_z) : error_{err}, - error_seq_{seq}, - request_z_{req_z}, - committed_z_{com_z}, - reserved_z_{rsv_z} {} - - /** error code **/ - error error_ = error::none; - - /** sequence# of this error. - * Each error event within an allocator gets next sequence number - **/ - uint32_t error_seq_ = 0; - /** reqeust size assoc'd with errror **/ - size_type request_z_ = 0; - /** committed allocator memory at time of error **/ - size_type committed_z_ = 0; - /** reserved allocator memory at time of error **/ - size_type reserved_z_ = 0; - }; - /** @class AAllocator * @brief Abstract facet for allocation * diff --git a/include/xo/alloc2/ACollector.hpp b/include/xo/alloc2/ACollector.hpp deleted file mode 100644 index c88a340..0000000 --- a/include/xo/alloc2/ACollector.hpp +++ /dev/null @@ -1,60 +0,0 @@ -/** @file ACollector.hpp - * - * @author Roland Conybeare, Dec 2025 - **/ - -#pragma once - -#include "IGCObject_Any.hpp" - -#include -#include -#include - -#include "gc/generation.hpp" -#include "gc/role.hpp" - -#include -#include - -namespace xo { - namespace mm { - using Copaque = const void *; - using Opaque = void *; - - struct IGCObject_Any; // see IGCObject_Any.hpp - - /** @class ACollector - * @brief Abstract facet for the XO garbage collector - * - * Collector also supports the @ref AAllocator facet, see also - **/ - struct ACollector { - using size_type = std::size_t; - - virtual int32_t _typeseq() const noexcept = 0; - - virtual size_type allocated(Copaque d, generation g, role r) const noexcept = 0; - virtual size_type reserved(Copaque d, generation g, role r) const noexcept = 0; - virtual size_type committed(Copaque d, generation g, role r) const noexcept = 0; - - /** install interface @p iface for representation with typeseq @p tseq - * in collector @p d. - * - * The type AGCObject_Any here is misleading. - * Will have been replaced by an instance of - * @c AGCObject_Xfer for some @c DFoo - * in which case calls through @c std::launder(&iface) - * will properly act on @c DFoo. - **/ - virtual void install_type(Opaque d, int32_t tseq, IGCObject_Any & iface); - virtual void add_gc_root(Opaque d, int32_t tseq, Opaque * root) = 0; - - /** evacuate @p *lhs to to-space and replace with forwarding pointer - * Require: gc in progress - **/ - virtual void forward_inplace(Opaque d, obj * lhs) = 0; - }; - } - -} /*namespace xo*/ diff --git a/include/xo/alloc2/AGCObject.hpp b/include/xo/alloc2/AGCObject.hpp deleted file mode 100644 index c558624..0000000 --- a/include/xo/alloc2/AGCObject.hpp +++ /dev/null @@ -1,54 +0,0 @@ -/** @file AGCObject.hpp - * - * @author Roland Conybeare, Dec 2025 - **/ - -#pragma once - -#include "IAllocator_Any.hpp" -#include "RAllocator.hpp" -#include "xo/facet/facet_implementation.hpp" -#include "xo/facet/typeseq.hpp" -#include "xo/facet/obj.hpp" // for obj in shallow_copy -#include -#include - -namespace xo { - namespace mm { - using Copaque = const void *; - using Opaque = void *; - - /** @class AObject - * @brief Abstract facet for collector-eligible data - * - * Data that supports AGCObject can have memory managed - * by ACollector - **/ - struct AGCObject { - using size_type = std::size_t; - - /** RTTI: unique id# for actual runtime data representation **/ - virtual int32_t _typeseq() const noexcept = 0; - - virtual size_type shallow_size(Copaque d) const noexcept = 0; - virtual Opaque * shallow_copy(Copaque d, - obj mm) const noexcept = 0; - virtual size_type forward_children(Opaque d) const noexcept = 0; - }; - - // implementation IGCObject_DRepr of AGCObject for state DRepr - // should provide a specialization: - // - // template <> - // struct xo::facet::FacetImplementation { - // using ImplType = IGCObject_DRepr; - // }; - // - // then IGCObject_ImplType --> IGCObject_DRepr - // - template - using IGCObject_ImplType = xo::facet::FacetImplType; - } /*namespace mm*/ -} /*namespace xo*/ - -/* end AGCObject.hpp */ diff --git a/include/xo/alloc2/ArenaConfig.hpp b/include/xo/alloc2/ArenaConfig.hpp index d96dcf0..f93b087 100644 --- a/include/xo/alloc2/ArenaConfig.hpp +++ b/include/xo/alloc2/ArenaConfig.hpp @@ -5,6 +5,7 @@ #pragma once +#include "AllocatorError.hpp" #include #include diff --git a/include/xo/alloc2/DArena.hpp b/include/xo/alloc2/DArena.hpp index fc38b60..982f6a2 100644 --- a/include/xo/alloc2/DArena.hpp +++ b/include/xo/alloc2/DArena.hpp @@ -48,6 +48,8 @@ namespace xo { /** create arena per configuration @p cfg. **/ static DArena map(const ArenaConfig & cfg); + /** null ctor **/ + DArena() = default; /** ctor from already-mapped (but not committed) address range **/ DArena(const ArenaConfig & cfg, size_type page_z, std::byte * lo, std::byte * hi); /** DArena is not copyable **/ @@ -57,6 +59,9 @@ namespace xo { /** dtor releases mapped memory **/ ~DArena(); + /** move-assignment **/ + DArena & operator=(DArena && other); + ///@} /** obtain uncommitted contiguous memory range comprising @@ -65,6 +70,14 @@ namespace xo { **/ static range_type map_aligned_range(size_type req_z, size_type hugepage_z); + /** @defgroup mm-arena-methods **/ + ///@{ + + /** true if arena is mapped i.e. has a reserved address range **/ + bool is_mapped() const { return (lo_ != nullptr) && (hi_ != nullptr); } + + ///@} + /** @defgroup mm-arena-instance-vars **/ ///@{ diff --git a/include/xo/alloc2/DCollector.hpp b/include/xo/alloc2/DCollector.hpp deleted file mode 100644 index af4bf1d..0000000 --- a/include/xo/alloc2/DCollector.hpp +++ /dev/null @@ -1,84 +0,0 @@ -/** @file DCollector.hpp - * - * @author Roland Conybeare, Dec 2025 - **/ - -#pragma once - -#include "ArenaConfig.hpp" -#include "DArena.hpp" -#include - -namespace xo { - namespace mm { - template - using up = std::unique_ptr; - - struct CollectorConfig { - using size_type = std::size_t; - - /** Configuration for collector spaces. - * Will have at least {nursery,tenured} x {from,to} spaces. - * Not using name_ member. - **/ - ArenaConfig arena_config_; - - /** Number of generations. - * Must be at least 2. - **/ - uint32_t n_generation_ = 2; - - /** Number of promotion steps. - * An object that survives this number of collections - * advances to the next generation. - **/ - uint32_t n_survive_threshold_ = 2; - - /** Trigger garbage collection when to-space allocation for - * generation g reaches gc_trigger_v_[g] - **/ - std::array gc_trigger_v_; - - /** true -> enable incremental collection. - * false -> only do full collection. - * - * Incremental collection requires mutation logs. - **/ - bool allow_incremental_gc_ = true; - - /** If non-zero remember statistics for - * the last @p stats_history_z_ collections. - **/ - uint32_t stats_history_z_ = false; - - /** true to enable debug logging **/ - bool debug_flag_ = false; - }; - - /** State associated with a single DCollector generation - **/ - struct Generation { - Generation(uint8_t gen_id, up from_space, up to_space); - ~Generation() = default; - - /** identity of this generation. Generations are numbered from - * 0 (youngest) to N (oldest), with N <= c_max_generation - **/ - uint8_t gen_id_; - /** from-space. empty between collection episodes. - * During collection holds former to-space - **/ - up from_space_; - /** to-space. New allocations occur here **/ - up to_space_; - }; - - struct DCollector { - std::uint32_t - - std::array, c_max_generation> generations_[2]; - }; - } /*namespace mm*/ -} /*namespace xo*/ - -/* end DCollector.hpp */ diff --git a/include/xo/alloc2/ICollector_Any.hpp b/include/xo/alloc2/ICollector_Any.hpp deleted file mode 100644 index 9e5d998..0000000 --- a/include/xo/alloc2/ICollector_Any.hpp +++ /dev/null @@ -1,51 +0,0 @@ -/** @file ICollector_Any.hpp - * - * @author Roland Conybeare, Dec 2025 - **/ - -#pragma once - -#include "ACollector.hpp" -//#include - -namespace xo { - namespace mm { struct ICollector_Any; } - - namespace facet { - template <> - struct FacetImplementation { - using ImplType = xo::mm::ICollector_Any; - }; - } - - namespace mm { - /** @class ICollector_Any - * @brief Stub Collector Implementation for empty variant instance - **/ - struct ICollector_Any : public ACollector { - using size_type = std::size_t; - - // from ACollector - int32_t _typeseq() const noexcept override { return s_typeseq; } - - // const methods - [[noreturn]] size_type allocated(Copaque, generation, role) const noexcept { _fatal(); } - [[noreturn]] size_type reserved(Copaque, generation, role) const noexcept { _fatal(); } - [[noreturn]] size_type committed(Copaque, generation, role) const noexcept { _fatal(); } - - // non-const methods - [[noreturn]] void install_type(Opaque, int32_t, IGCObject_Any &) noexcept { _fatal(); } - [[noreturn]] void add_gc_root(Opaque, int32_t, Opaque *) { _fatal(); } - [[noreturn]] void forward_inplace(Opaque, obj *) { _fatal(); } - - private: - [[noreturn]] static void _fatal(); - - public: - static int32_t s_typeseq; - static bool _valid; - }; - } /*namespace mm*/ -} /*namespace xo*/ - -/* end ICollector_Any.hpp */ diff --git a/include/xo/alloc2/IGCObject_Any.hpp b/include/xo/alloc2/IGCObject_Any.hpp deleted file mode 100644 index 039a125..0000000 --- a/include/xo/alloc2/IGCObject_Any.hpp +++ /dev/null @@ -1,48 +0,0 @@ -/** @file IGCObject_Any.hpp - * - * @author Roland Conybeare, Dec 2025 - **/ - -#pragma once - -#include "AGCObject.hpp" -#include - -namespace xo { - namespace mm { struct IGCObject_Any; } - - namespace facet { - template <> - struct FacetImplementation { - using ImplType = xo::mm::IGCObject_Any; - }; - } - - namespace mm { - /** @class IGCObject_Any - * @brief AGCObject implementation for empty variant instance - **/ - struct IGCObject_Any : public AGCObject { - using size_type = std::size_t; - - const AGCObject * iface() const { return std::launder(this); } - - // from AGCObject - int32_t _typeseq() const noexcept override { return s_typeseq; } - - [[noreturn]] size_type shallow_size(Copaque) const noexcept override { _fatal(); } - [[noreturn]] Opaque * shallow_copy(Copaque, - obj) const noexcept override { _fatal(); } - [[noreturn]] size_type forward_children(Opaque) const noexcept override { _fatal(); } - - private: - [[noreturn]] static void _fatal(); - - public: - static int32_t s_typeseq; - static bool _valid; - }; - } /*namespace mm*/ -} /*namespace xo*/ - -/* end IGCObject_Any.hpp */ diff --git a/include/xo/alloc2/IGCObject_Xfer.hpp b/include/xo/alloc2/IGCObject_Xfer.hpp deleted file mode 100644 index 75f78fd..0000000 --- a/include/xo/alloc2/IGCObject_Xfer.hpp +++ /dev/null @@ -1,62 +0,0 @@ -/** @file IGCObject_Xfer.hpp - * - * @author Roland Conybeare, Dec 2025 - **/ - -#pragma once - -#include "AGCObject.hpp" - -namespace xo { - namespace mm { - /** @class IGCObject_Xfer - * - * Adapts typed GC object implementation @tparam IGCObject_DRepr - * to type-erased @ref AGCObject interface - **/ - template - struct IGCObject_Xfer : public AGCObject { - using Impl = IGCObject_DRepr; - using size_type = AGCObject::size_type; - - static const DRepr & _dcast(Copaque d) { return *(const DRepr *)d; } - static DRepr & _dcast(Opaque d) { return *(DRepr *)d; } - - // from AGCObject - - // const methods - - int32_t _typeseq() const noexcept override { return s_typeseq; } - size_type shallow_size(Copaque d) const noexcept override { - return I::shallow_copy(_dcast(d)); - } - Opaque * shallow_copy(Copaque d, obj mm) const noexcept override { - return I::shallow_size(_dcast(d), mm); - } - - // non-const methods - - size_type forward_children(Opaque d) const noexcept override { - return I::forward_children(d); - } - - private: - using I = Impl; - - public: - static int32_t s_typeseq; - static bool _valid; - }; - - template - int32_t - IGCObject_Xfer::s_typeseq = facet::typeseq::id(); - - template - bool - IGCObject_Xfer::_valid = facet::valid_facet_implementation(); - - } /*namespace mm*/ -} /*namespace xo*/ - -/* end IGCObject_Xfer.hpp */ diff --git a/include/xo/alloc2/RCollector.hpp b/include/xo/alloc2/RCollector.hpp deleted file mode 100644 index 5da5b30..0000000 --- a/include/xo/alloc2/RCollector.hpp +++ /dev/null @@ -1,51 +0,0 @@ -/** @file RCollector.hpp - * - * @author Roland Conybeare, Dec 2025 - **/ - -#include "ACollector.hpp" -#include - -namespace xo { - namespace mm { - /** @class RCollector **/ - template - struct RCollector : public Object { - private: - using O = Object; - public: - using ObjectType = Object; - using DataPtr = Object::DataPtr; - using size_type = std::size_t; - //using value_type = std::byte *; - - RCollector() = default; - RCollector(DataPtr data) : Object{std::move(data)} {} - - int32_t _typeseq() const noexcept { return O::iface()->_typeseq(); } - size_type allocated(generation g, role r) const noexcept { return O::iface()->allocated(O::data()); } - size_type reserved(generation g, role r) const noexcept { return O::iface()->reserved(O::data()); } - size_type committed(generation g, role r) const noexcept { return O::iface()->committed(O::data()); } - - void install_type(int32_t tseq, IGCObject_Any & iface) { return O::iface()->install_type(O::data()); } - void add_gc_root(int32_t tseq, Opaque * root) { O::iface()->add_gc_root(O::data()); } - - void forward_inplace(obj * lhs) { O::iface()->forward_inplace(O::data(), lhs); } - - static bool _valid; - }; - - template - bool - RCollector::_valid = facet::valid_object_router(); - } /*namespace mm*/ - - namespace facet { - template - struct RoutingFor { - using RoutingType = xo::mm::RCollector; - }; - } -} /*namespace xo*/ - -/* end RCollector.hpp */ diff --git a/include/xo/alloc2/RCollector_Any.hpp b/include/xo/alloc2/RCollector_Any.hpp deleted file mode 100644 index 5799aa6..0000000 --- a/include/xo/alloc2/RCollector_Any.hpp +++ /dev/null @@ -1,51 +0,0 @@ -/** @file RCollector_Any.hpp - * - * @author Roland Conybeare, Dec 2025 - **/ - -#pragma once - -#include "ACollector.hpp" -//#include - -namespace xo { - namespace mm { struct ICollector_Any; } - - namespace facet { - template <> - struct FacetImplementation { - using ImplType = xo::mm::ICollector_Any; - }; - } - - namespace mm { - /** @class ICollector_Any - * @brief Stub Collector Implementation for empty variant instance - **/ - struct ICollector_Any : public ACollector { - using size_type = std::size_t; - - // from ACollector - int32_t _typeseq() const noexcept override { return s_typeseq; } - - // const methods - [[noreturn]] size_type allocated(Copaque, generation, role) const noexcept { _fatal(); } - [[noreturn]] size_type reserved(Copaque, generation, role) const noexcept { _fatal(); } - [[noreturn]] size_type committed(Copaque, generation, role) const noexcept { _fatal(); } - - // non-const methods - [[noreturn]] void install_type(Opaque, int32_t, IGCObject_Any &) noexcept { _fatal(); } - [[noreturn]] void add_gc_root(Opaque, int32_t, Opaque *) { _fatal(); } - [[noreturn]] void forward_inplace(Opaque, Opaque **) { _fatail(); } - - private: - [[noreturn]] static void _fatal(); - - public: - static int32_t s_typeseq; - static bool _valid; - }; - } /*namespace mm*/ -} /*namespace xo*/ - -/* end RCollector_Any.hpp */ diff --git a/include/xo/alloc2/RGCObject.hpp b/include/xo/alloc2/RGCObject.hpp deleted file mode 100644 index 054b995..0000000 --- a/include/xo/alloc2/RGCObject.hpp +++ /dev/null @@ -1,47 +0,0 @@ -/** @file RGCObject.hpp - * - * @author Roland Conybeare, Dec 2025 - **/ - -#pragma once - -#include "AGCObject.hpp" -#include - -namespace xo { - namespace mm { - /** @class RGCObject **/ - template - struct RGCObject : public Object { - private: - using O = Object; - public: - using ObjectType = Object; - using DataPtr = Object::DataPtr; - using size_type = std::size_t; - - RGCObject() = default; - RGCObject(Object::DataPtr data) : Object{std::move(data)} {} - - int32_t _typeseq() const noexcept { return O::iface()->_typeseq(); } - size_type shallow_size() const noexcept { O::iface()->shallow_size(O::data()); } - Opaque * shallow_copy(obj mm) const noexcept { O::iface()->shallow_copy(O::data(), mm); } - size_type forward_children() noexcept { O::iface()->forward_children(O::data()); } - - static bool _valid; - }; - - template - bool - RGCObject::_valid = facet::valid_object_router(); - } /*namespace mm*/ - - namespace facet { - template - struct RoutingFor { - using RoutingType = xo::mm::RGCObject; - }; - } -} /*namespace xo*/ - -/* end RGCObject.hpp */ diff --git a/include/xo/alloc2/gc/generation.hpp b/include/xo/alloc2/gc/generation.hpp index 96a69a2..70e9c85 100644 --- a/include/xo/alloc2/gc/generation.hpp +++ b/include/xo/alloc2/gc/generation.hpp @@ -19,9 +19,11 @@ namespace xo { struct generation { using value_type = std::uint32_t; - explicit generation(value_type x) : value_{x} {} + explicit constexpr generation(value_type x) : value_{x} {} - operator value_type() const { return value_; } + constexpr operator value_type() const { return value_; } + + generation & operator++() { ++value_; return *this; } std::uint32_t value_; }; diff --git a/include/xo/alloc2/gc/role.hpp b/include/xo/alloc2/gc/role.hpp index 619522a..3f2de53 100644 --- a/include/xo/alloc2/gc/role.hpp +++ b/include/xo/alloc2/gc/role.hpp @@ -9,23 +9,20 @@ namespace xo { namespace mm { - enum class role { - /** GC will keep one to-space for each generation. - * Application allocs always happen in to-space. - **/ - to_space, - /** During normal operation from-space is empty. - * During collection phase itself, - * to-space and from-space are exchanged, - * with from-space becoming the space to be collected - **/ - from_space, - /** counts entries **/ - N + static constexpr uint32_t c_n_role = 2; + + struct role { + using value_type = std::uint32_t; + + explicit constexpr role(value_type x) : role_{x} {} + + static constexpr role to_space() { return role{0}; } + static constexpr role from_space() { return role{1}; } + + operator value_type() const { return role_; } + + std::uint32_t role_; }; - - constexpr uint32_t role2int(role x) { return static_cast(x); } - } /*namespace mm*/ } /*namespace xo*/ diff --git a/src/alloc2/CMakeLists.txt b/src/alloc2/CMakeLists.txt index 28f8c20..9d65bf5 100644 --- a/src/alloc2/CMakeLists.txt +++ b/src/alloc2/CMakeLists.txt @@ -9,8 +9,10 @@ set(SELF_SRCS IAllocator_DArena.cpp ICollector_Any.cpp - IGCObject_Any.cpp + + DX1Collector.cpp + ) xo_add_shared_library4(${SELF_LIB} ${PROJECT_NAME}Targets ${PROJECT_VERSION} 1 ${SELF_SRCS}) diff --git a/src/alloc2/DArena.cpp b/src/alloc2/DArena.cpp index 4d7bdc0..c3f515a 100644 --- a/src/alloc2/DArena.cpp +++ b/src/alloc2/DArena.cpp @@ -192,6 +192,31 @@ namespace xo { other.last_error_ = AllocatorError(); } + DArena & + DArena::operator=(DArena && other) + { + config_ = other.config_; + page_z_ = other.page_z_; + lo_ = other.lo_; + committed_z_ = other.committed_z_; + free_ = other.free_; + limit_ = other.limit_; + hi_ = other.hi_; + error_count_ = other.error_count_; + last_error_ = other.last_error_; + + other.config_ = ArenaConfig(); + other.lo_ = nullptr; + other.committed_z_ = 0; + other.free_ = nullptr; + other.limit_ = nullptr; + other.hi_ = nullptr; + other.error_count_ = 0; + other.last_error_ = AllocatorError(); + + return *this; + } + DArena::~DArena() { if (lo_) { diff --git a/src/alloc2/ICollector_Any.cpp b/src/alloc2/ICollector_Any.cpp index 8f0069b..57700ad 100644 --- a/src/alloc2/ICollector_Any.cpp +++ b/src/alloc2/ICollector_Any.cpp @@ -3,7 +3,7 @@ * @author Roland Conybeare, Dec 2025 **/ -#include "ICollector_Any.hpp" +#include "gc/ICollector_Any.hpp" #include namespace xo { diff --git a/src/alloc2/IGCObject_Any.cpp b/src/alloc2/IGCObject_Any.cpp index 788fe41..f7b1336 100644 --- a/src/alloc2/IGCObject_Any.cpp +++ b/src/alloc2/IGCObject_Any.cpp @@ -3,7 +3,7 @@ * @author Roland Conybeare, Dec 2025 **/ -#include "IGCObject_Any.hpp" +#include "gc/IGCObject_Any.hpp" #include namespace xo { diff --git a/utest/CMakeLists.txt b/utest/CMakeLists.txt index e21c3cd..a4b976b 100644 --- a/utest/CMakeLists.txt +++ b/utest/CMakeLists.txt @@ -5,7 +5,9 @@ set(UTEST_EXE utest.alloc2) set(UTEST_SRCS alloc2_utest_main.cpp arena.test.cpp - objectmodel.test.cpp) + objectmodel.test.cpp + Collector.test.cpp +) if (ENABLE_TESTING) xo_add_utest_executable(${UTEST_EXE} ${UTEST_SRCS})