xo-gc: refactor: move _deep_move_root() to GCObjectStore
This commit is contained in:
parent
d24f75b9ef
commit
177430d8a4
4 changed files with 65 additions and 62 deletions
|
|
@ -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_));
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue