From 85204e9847a85ec24d5f8f91c76a9abca3847b6f Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Wed, 17 Dec 2025 21:02:30 -0500 Subject: [PATCH] xo-alloc2: bugfix for DX1CollectorIterator --- include/xo/alloc2/cmpresult.hpp | 13 ++++++++++- src/alloc2/CMakeLists.txt | 1 + src/alloc2/DArenaIterator.cpp | 6 +++++ src/alloc2/DX1Collector.cpp | 14 +++++++++-- src/alloc2/DX1CollectorIterator.cpp | 8 +++++-- src/alloc2/cmpresult.cpp | 36 +++++++++++++++++++++++++++++ 6 files changed, 73 insertions(+), 5 deletions(-) create mode 100644 src/alloc2/cmpresult.cpp diff --git a/include/xo/alloc2/cmpresult.hpp b/include/xo/alloc2/cmpresult.hpp index 9fab433..2b67d0a 100644 --- a/include/xo/alloc2/cmpresult.hpp +++ b/include/xo/alloc2/cmpresult.hpp @@ -16,6 +16,14 @@ namespace xo { incomparable = 1, }; + extern const char * comparison2str(comparison x); + + inline std::ostream & + operator<<(std::ostream & os, comparison x) { + os << comparison2str(x); + return os; + } + struct cmpresult { cmpresult() : err_{comparison::invalid}, cmp_{0} {} cmpresult(comparison err, std::int16_t cmp) : err_{err}, cmp_{cmp} {} @@ -35,6 +43,8 @@ namespace xo { return cmpresult::greater(); } + /** print to stream **/ + void display(std::ostream & os) const; bool is_equal() const { return (err_ == comparison::comparable) && (cmp_ == 0); } @@ -50,7 +60,8 @@ namespace xo { inline std::ostream & operator<<(std::ostream & os, const cmpresult & x) { - os << ""; + x.display(os); + return os; } } /*namespace mm*/ diff --git a/src/alloc2/CMakeLists.txt b/src/alloc2/CMakeLists.txt index 7dde13f..8732713 100644 --- a/src/alloc2/CMakeLists.txt +++ b/src/alloc2/CMakeLists.txt @@ -4,6 +4,7 @@ set(SELF_LIB xo_alloc2) set(SELF_SRCS AllocInfo.cpp + cmpresult.cpp AAllocator.cpp DArena.cpp diff --git a/src/alloc2/DArenaIterator.cpp b/src/alloc2/DArenaIterator.cpp index 2a3e852..4704746 100644 --- a/src/alloc2/DArenaIterator.cpp +++ b/src/alloc2/DArenaIterator.cpp @@ -87,6 +87,12 @@ namespace xo { cmpresult DArenaIterator::compare(const DArenaIterator & other_ix) const noexcept { + scope log(XO_DEBUG(false), + xtag("arena", arena_), + xtag("pos", pos_), + xtag("other.arena", other_ix.arena_), + xtag("other.pos", other_ix.pos_)); + if (is_invalid() || (arena_ != other_ix.arena_)) return cmpresult::incomparable(); diff --git a/src/alloc2/DX1Collector.cpp b/src/alloc2/DX1Collector.cpp index 1ac6cdf..8b033a7 100644 --- a/src/alloc2/DX1Collector.cpp +++ b/src/alloc2/DX1Collector.cpp @@ -238,11 +238,21 @@ namespace xo { DX1Collector::end() const noexcept { generation gen_hi = generation{config_.n_generation_}; + /** valid iterator for end points to end of last DArena. + * otherwise will interfere with working compare + * (since invalid iterators are incomparable) + **/ + + const DArena * arena + = get_space(role::to_space(), + generation(config_.n_generation_ - 1)); + DArenaIterator arena_end = arena->end(); + return DX1CollectorIterator(this, gen_hi, gen_hi, - DArenaIterator(), - DArenaIterator()); + arena_end, + arena_end); } void diff --git a/src/alloc2/DX1CollectorIterator.cpp b/src/alloc2/DX1CollectorIterator.cpp index c8377ca..799b38a 100644 --- a/src/alloc2/DX1CollectorIterator.cpp +++ b/src/alloc2/DX1CollectorIterator.cpp @@ -51,7 +51,7 @@ namespace xo { cmpresult DX1CollectorIterator::compare(const DX1CollectorIterator & other_ix) const noexcept { - scope log(XO_DEBUG(true), + scope log(XO_DEBUG(false), xtag("is_valid", is_valid()), xtag("other_ix.is_valid", other_ix.is_valid()) ); @@ -71,7 +71,11 @@ namespace xo { /* both iterators refer to the same arena, * so can compare their arena iterators directly */ - return arena_ix_.compare(other_ix.arena_ix_); + cmpresult retval = arena_ix_.compare(other_ix.arena_ix_); + + log && log(xtag("retval", retval)); + + return retval; } void diff --git a/src/alloc2/cmpresult.cpp b/src/alloc2/cmpresult.cpp new file mode 100644 index 0000000..d9f4713 --- /dev/null +++ b/src/alloc2/cmpresult.cpp @@ -0,0 +1,36 @@ +/** @file cmpresult.cpp + * + * @author Roland Conybeare, Dec 2025 + **/ + +#include "cmpresult.hpp" +#include +#include + +namespace xo { + namespace mm { + const char * + comparison2str(comparison x) + { + switch (x) { + case comparison::invalid: + return "?comparison"; + case comparison::comparable: + return "cmp"; + case comparison::incomparable: + return "!cmp"; + } + } + + void + cmpresult::display(std::ostream & os) const + { + os << ""; + } + } /*namespace mm*/ +} /*namespace xo*/ + +/* end cmpresult.cpp */