VM: visit_roots and visit_contexts where always called in tandem, make a new method visit_all_roots that calls them both
parent
fe2c2d23de
commit
5490c50217
|
@ -38,9 +38,8 @@ void factor_vm::collect_aging() {
|
|||
copying_collector<aging_space, aging_policy> collector(this,
|
||||
this->data->aging,
|
||||
aging_policy(this));
|
||||
collector.data_visitor.visit_roots();
|
||||
collector.data_visitor.visit_contexts();
|
||||
|
||||
collector.visitor.visit_all_roots();
|
||||
collector.cheneys_algorithm();
|
||||
|
||||
data->reset_nursery();
|
||||
|
|
|
@ -44,10 +44,13 @@ template <typename Iterator, typename Fixup>
|
|||
void factor_vm::iterate_callstack(context* ctx, Iterator& iterator,
|
||||
Fixup& fixup) {
|
||||
|
||||
FACTOR_ASSERT(!Fixup::translated_code_block_map);
|
||||
cell top = ctx->callstack_top;
|
||||
cell bottom = ctx->callstack_bottom;
|
||||
/* When we are translating the code block maps, all callstacks must
|
||||
be empty. */
|
||||
FACTOR_ASSERT(!Fixup::translated_code_block_map || top == bottom);
|
||||
|
||||
while (top < ctx->callstack_bottom) {
|
||||
while (top < bottom) {
|
||||
cell addr = *(cell*)top;
|
||||
FACTOR_ASSERT(addr != 0);
|
||||
|
||||
|
@ -65,7 +68,7 @@ void factor_vm::iterate_callstack(context* ctx, Iterator& iterator,
|
|||
iterator(top, size, owner, addr);
|
||||
top += size;
|
||||
}
|
||||
FACTOR_ASSERT(top == ctx->callstack_bottom);
|
||||
FACTOR_ASSERT(top == bottom);
|
||||
}
|
||||
|
||||
/* Allocates memory */
|
||||
|
|
|
@ -211,8 +211,7 @@ void factor_vm::collect_compact_impl() {
|
|||
code->allocator->compact(code_block_updater, fixup, &code_finger);
|
||||
}
|
||||
|
||||
forwarder.visit_roots();
|
||||
forwarder.visit_contexts();
|
||||
forwarder.visit_all_roots();
|
||||
forwarder.visit_context_code_blocks();
|
||||
}
|
||||
|
||||
|
|
|
@ -32,8 +32,7 @@ void factor_vm::collect_mark_impl() {
|
|||
code->allocator->state.clear_mark_bits();
|
||||
data->tenured->state.clear_mark_bits();
|
||||
|
||||
visitor.visit_roots();
|
||||
visitor.visit_contexts();
|
||||
visitor.visit_all_roots();
|
||||
visitor.visit_context_code_blocks();
|
||||
visitor.visit_uninitialized_code_blocks();
|
||||
|
||||
|
|
|
@ -117,8 +117,8 @@ struct start_object_updater {
|
|||
|
||||
void factor_vm::fixup_data(cell data_offset, cell code_offset) {
|
||||
startup_fixup fixup(data_offset, code_offset);
|
||||
slot_visitor<startup_fixup> data_workhorse(this, fixup);
|
||||
data_workhorse.visit_roots();
|
||||
slot_visitor<startup_fixup> visitor(this, fixup);
|
||||
visitor.visit_all_roots();
|
||||
|
||||
start_object_updater updater(this, fixup);
|
||||
data->tenured->iterate(updater, fixup);
|
||||
|
|
|
@ -9,9 +9,7 @@ void factor_vm::collect_nursery() {
|
|||
this->data->aging,
|
||||
nursery_policy(this));
|
||||
|
||||
collector.data_visitor.visit_roots();
|
||||
collector.data_visitor.visit_contexts();
|
||||
|
||||
collector.visitor.visit_all_roots();
|
||||
gc_event* event = current_gc->event;
|
||||
|
||||
if (event)
|
||||
|
|
|
@ -146,8 +146,7 @@ void factor_vm::primitive_become() {
|
|||
{
|
||||
slot_visitor<slot_become_fixup> workhorse(this,
|
||||
slot_become_fixup(&become_map));
|
||||
workhorse.visit_roots();
|
||||
workhorse.visit_contexts();
|
||||
workhorse.visit_all_roots();
|
||||
|
||||
object_become_visitor object_visitor(&workhorse);
|
||||
each_object(object_visitor);
|
||||
|
|
|
@ -101,9 +101,8 @@ them.
|
|||
This is used by GC's copying, sweep and compact phases, and the implementation
|
||||
of the become primitive.
|
||||
|
||||
Iteration is driven by visit_*() methods. Some of them define GC roots:
|
||||
- visit_roots()
|
||||
- visit_contexts()
|
||||
Iteration is driven by visit_*() methods. Only one of them define GC roots:
|
||||
- visit_all_roots()
|
||||
|
||||
Code block visitors iterate over sets of code blocks, applying a functor to
|
||||
each one. The functor returns a new code_block pointer, which may or may not
|
||||
|
@ -132,7 +131,7 @@ template <typename Fixup> struct slot_visitor {
|
|||
void visit_data_roots();
|
||||
void visit_callback_roots();
|
||||
void visit_literal_table_roots();
|
||||
void visit_roots();
|
||||
void visit_all_roots();
|
||||
void visit_callstack_object(callstack* stack);
|
||||
void visit_callstack(context* ctx);
|
||||
void visit_context(context *ctx);
|
||||
|
@ -242,7 +241,7 @@ template <typename Fixup> void slot_visitor<Fixup>::visit_sample_threads() {
|
|||
}
|
||||
}
|
||||
|
||||
template <typename Fixup> void slot_visitor<Fixup>::visit_roots() {
|
||||
template <typename Fixup> void slot_visitor<Fixup>::visit_all_roots() {
|
||||
visit_handle(&parent->true_object);
|
||||
visit_handle(&parent->bignum_zero);
|
||||
visit_handle(&parent->bignum_pos_one);
|
||||
|
@ -256,6 +255,9 @@ template <typename Fixup> void slot_visitor<Fixup>::visit_roots() {
|
|||
|
||||
visit_object_array(parent->special_objects,
|
||||
parent->special_objects + special_object_count);
|
||||
|
||||
|
||||
visit_contexts();
|
||||
}
|
||||
|
||||
/* primitive_minor_gc() is invoked by inline GC checks, and it needs to fill in
|
||||
|
|
|
@ -22,9 +22,7 @@ void factor_vm::collect_to_tenured() {
|
|||
|
||||
mark_stack.clear();
|
||||
|
||||
collector.data_visitor.visit_roots();
|
||||
collector.data_visitor.visit_contexts();
|
||||
|
||||
collector.visitor.visit_all_roots();
|
||||
gc_event* event = current_gc->event;
|
||||
|
||||
if (event)
|
||||
|
|
Loading…
Reference in New Issue