From 177430d8a44432b1fe608484d1fb6a5154ba72c5 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Fri, 3 Apr 2026 16:42:04 -0400 Subject: [PATCH] xo-gc: refactor: move _deep_move_root() to GCObjectStore --- include/xo/gc/GCObjectStore.hpp | 16 ++++++++-- src/gc/DX1Collector.cpp | 56 +-------------------------------- src/gc/GCObjectStore.cpp | 51 ++++++++++++++++++++++++++++-- src/gc/MutationLogStore.cpp | 4 ++- 4 files changed, 65 insertions(+), 62 deletions(-) diff --git a/include/xo/gc/GCObjectStore.hpp b/include/xo/gc/GCObjectStore.hpp index 67a5506..f10381b 100644 --- a/include/xo/gc/GCObjectStore.hpp +++ b/include/xo/gc/GCObjectStore.hpp @@ -108,12 +108,22 @@ namespace xo { **/ bool install_type(const AGCObject & meta) noexcept; + /** move subgraph at @p root to to-space on behalf of collector @p gc + * Special behavior relative to @ref _deep_move_interior : + * If @p root is not in gc-space, visit immediate children and move them in place (!). + + * Require: runstate_.is_running() + **/ + void * _deep_move_root(DX1Collector * gc, + obj from_src, + Generation upto); + /** move interior subgraph at @p from_src to to-space. * no-op if not in gc-space. **/ - void * deep_move_interior(DX1Collector * gc, - void * from_src, - Generation upto); + void * _deep_move_interior(DX1Collector * gc, + void * from_src, + Generation upto); /** Common driver for _deep_move_root(), _deep_move_interior(). * Move object subgraph @p from_src on behalf of @p gc collection cycle, diff --git a/src/gc/DX1Collector.cpp b/src/gc/DX1Collector.cpp index 56f5a74..3dd7c16 100644 --- a/src/gc/DX1Collector.cpp +++ b/src/gc/DX1Collector.cpp @@ -807,63 +807,9 @@ namespace xo { DX1Collector::_deep_move_root(obj from_src, Generation upto) { - // NOTE: - // Some roots are non-gc-owned nodes. - // GC must still visit immediate children of these nodes - // to move gc-owned children. - // This implements virtual root node feature, - // intended to mitigate mutation log churn. - - scope log(XO_DEBUG(config_.debug_flag_)); - - if (!from_src) - return nullptr; - - bool src_in_from_space = this->contains(role::from_space(), from_src.data()); - - if (src_in_from_space) { - return _deep_move_gc_owned(from_src.data(), upto); - } else { - // we aren't moving from_src, it's not gc-owned. - // However weare moving all its gc-owned children - - auto self = this->ref(); - - GCMoveCheckpoint gray_lo_v = this->_snap_move_checkpoint(upto); - - from_src.forward_children(self); - - // For each generation g: - // traverse objects newer than gray_lo_v[g], to make sure children - // are forwarded. Fixpoint reached when gray_lo_v[g] doesn't change. - // Remember that forwarding may promote objects to older generation, - // so need multiple passes - // - this->_forward_children_until_fixpoint(upto, gray_lo_v); - - return from_src.data(); - } + return gco_store_._deep_move_root(this, from_src, upto); } -#ifdef OBSOLETE - void * - DX1Collector::deep_move_interior(void * from_src, - Generation upto) - { - scope log(XO_DEBUG(config_.debug_flag_)); - - if (!from_src) - return nullptr; - - bool src_in_from_space = this->contains(role::from_space(), from_src); - - if (!src_in_from_space) - return from_src; - - return _deep_move_gc_owned(from_src, upto); - } -#endif - /* * rules: * - from_src must be in from-space diff --git a/src/gc/GCObjectStore.cpp b/src/gc/GCObjectStore.cpp index 6b09678..27f70a7 100644 --- a/src/gc/GCObjectStore.cpp +++ b/src/gc/GCObjectStore.cpp @@ -626,9 +626,54 @@ namespace xo { } void * - GCObjectStore::deep_move_interior(DX1Collector * gc, - void * from_src, - Generation upto) + GCObjectStore::_deep_move_root(DX1Collector * gc, + obj from_src, + Generation upto) + { + // NOTE: + // Some roots are non-gc-owned nodes. + // GC must still visit immediate children of these nodes + // to move gc-owned children. + // This implements virtual root node feature, + // intended to mitigate mutation log churn. + + scope log(XO_DEBUG(config_.debug_flag_)); + + if (!from_src) + return nullptr; + + bool src_in_from_space = this->contains(role::from_space(), + from_src.data()); + + if (src_in_from_space) { + return this->_deep_move_gc_owned(gc, from_src.data(), upto); + } else { + // we aren't moving from_src, it's not gc-owned. + // However weare moving all its gc-owned children + + auto gc_obj = gc->ref(); + + GCMoveCheckpoint gray_lo_v + = this->snap_move_checkpoint(upto); + + from_src.forward_children(gc_obj); + + // For each generation g: + // traverse objects newer than gray_lo_v[g], to make sure children + // are forwarded. Fixpoint reached when gray_lo_v[g] doesn't change. + // Remember that forwarding may promote objects to older generation, + // so need multiple passes + // + this->_forward_children_until_fixpoint(gc, upto, gray_lo_v); + + return from_src.data(); + } + } + + void * + GCObjectStore::_deep_move_interior(DX1Collector * gc, + void * from_src, + Generation upto) { scope log(XO_DEBUG(config_.debug_flag_)); diff --git a/src/gc/MutationLogStore.cpp b/src/gc/MutationLogStore.cpp index 0495035..d957fe6 100644 --- a/src/gc/MutationLogStore.cpp +++ b/src/gc/MutationLogStore.cpp @@ -400,7 +400,9 @@ namespace xo { ++counters.n_rescue_; - child_to = gc->gco_store().deep_move_interior(gc, child_fr, upto); + GCObjectStore & gco_store = gc->gco_store(); + + child_to = gco_store._deep_move_interior(gc, child_fr, upto); // update child pointer in parent object *from_entry.p_data() = child_to;