xo-gc: refactor: move _deep_move_root() to GCObjectStore

This commit is contained in:
Roland Conybeare 2026-04-03 16:42:04 -04:00
commit 177430d8a4
4 changed files with 65 additions and 62 deletions

View file

@ -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<AGCObject> 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<ACollector>();
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_));