diff --git a/vm/aging_collector.cpp b/vm/aging_collector.cpp index a7511466bd..77b4a1645c 100644 --- a/vm/aging_collector.cpp +++ b/vm/aging_collector.cpp @@ -26,26 +26,26 @@ void factor_vm::collect_aging() { raised. */ current_gc->op = collect_to_tenured_op; - collector collector(this, - data->tenured, - to_tenured_policy(this)); + gc_workhorse + workhorse(this, data->tenured, to_tenured_policy(this)); + slot_visitor> + visitor(this, workhorse); + gc_event* event = current_gc->event; if (event) event->reset_timer(); - collector.visitor.visit_cards(data->tenured, card_points_to_aging, 0xff); - if (event) { - event->ended_card_scan(collector.visitor.cards_scanned, - collector.visitor.decks_scanned); - } + visitor.visit_cards(data->tenured, card_points_to_aging, 0xff); + if (event) + event->ended_card_scan(visitor.cards_scanned, visitor.decks_scanned); if (event) event->reset_timer(); - collector.visitor.visit_code_heap_roots(&code->points_to_aging); + visitor.visit_code_heap_roots(&code->points_to_aging); if (event) event->ended_code_scan(code->points_to_aging.size()); - collector.visitor.visit_mark_stack(&mark_stack); + visitor.visit_mark_stack(&mark_stack); } { /* If collection fails here, do a to_tenured collection. */ @@ -54,12 +54,15 @@ void factor_vm::collect_aging() { std::swap(data->aging, data->aging_semispace); data->reset_aging(); - collector collector(this, - data->aging, - aging_policy(this)); + aging_space *target = data->aging; + gc_workhorse + workhorse(this, target, aging_policy(this)); + slot_visitor> + visitor(this, workhorse); + cell scan = target->start + target->occupied_space(); - collector.visitor.visit_all_roots(); - collector.cheneys_algorithm(); + visitor.visit_all_roots(); + visitor.cheneys_algorithm(target, scan); data->reset_nursery(); code->clear_remembered_set(); diff --git a/vm/collector.hpp b/vm/collector.hpp index 32719b5f2c..f15479219d 100644 --- a/vm/collector.hpp +++ b/vm/collector.hpp @@ -59,25 +59,4 @@ struct gc_workhorse : no_fixup { } }; -template struct collector { - data_heap* data; - TargetGeneration* target; - slot_visitor > visitor; - cell scan; - - collector(factor_vm* parent, TargetGeneration* target, Policy policy) - : data(parent->data), - target(target), - visitor(parent, gc_workhorse(parent, target, policy)) { - scan = target->start + target->occupied_space(); - } - - void cheneys_algorithm() { - while (scan && scan < this->target->here) { - this->visitor.visit_object((object*)scan); - scan = this->target->next_object_after(scan); - } - } -}; - } diff --git a/vm/full_collector.cpp b/vm/full_collector.cpp index c815990b7c..788f15c6ff 100644 --- a/vm/full_collector.cpp +++ b/vm/full_collector.cpp @@ -42,9 +42,8 @@ void factor_vm::update_code_roots_for_sweep() { void factor_vm::collect_mark_impl() { gc_workhorse workhorse(this, this->data->tenured, full_policy(this)); - - slot_visitor > - visitor(this, workhorse); + slot_visitor> + visitor(this, workhorse); mark_stack.clear(); diff --git a/vm/nursery_collector.cpp b/vm/nursery_collector.cpp index 2bd5515fbe..f86f6768bf 100644 --- a/vm/nursery_collector.cpp +++ b/vm/nursery_collector.cpp @@ -20,31 +20,31 @@ void factor_vm::collect_nursery() { /* Copy live objects from the nursery (as determined by the root set and marked cards in aging and tenured) to aging space. */ - nursery_policy policy(this->data->nursery); - collector - collector(this, this->data->aging, policy); + gc_workhorse + workhorse(this, data->aging, nursery_policy(data->nursery)); + slot_visitor> + visitor(this, workhorse); - collector.visitor.visit_all_roots(); + cell scan = data->aging->start + data->aging->occupied_space(); + + visitor.visit_all_roots(); gc_event* event = current_gc->event; if (event) event->reset_timer(); - collector.visitor.visit_cards(data->tenured, card_points_to_nursery, - card_points_to_nursery); - collector.visitor.visit_cards(data->aging, card_points_to_nursery, 0xff); - - if (event) { - event->ended_card_scan(collector.visitor.cards_scanned, - collector.visitor.decks_scanned); - } + visitor.visit_cards(data->tenured, card_points_to_nursery, + card_points_to_nursery); + visitor.visit_cards(data->aging, card_points_to_nursery, 0xff); + if (event) + event->ended_card_scan(visitor.cards_scanned, visitor.decks_scanned); if (event) event->reset_timer(); - collector.visitor.visit_code_heap_roots(&code->points_to_nursery); + visitor.visit_code_heap_roots(&code->points_to_nursery); if (event) event->ended_code_scan(code->points_to_nursery.size()); - collector.cheneys_algorithm(); + visitor.cheneys_algorithm(data->aging, scan); data->reset_nursery(); code->points_to_nursery.clear(); diff --git a/vm/slot_visitor.hpp b/vm/slot_visitor.hpp index 2eb3aad98c..96bc49dfdd 100644 --- a/vm/slot_visitor.hpp +++ b/vm/slot_visitor.hpp @@ -152,11 +152,12 @@ template struct slot_visitor { template cell visit_card(SourceGeneration* gen, cell index, cell start); - template void visit_cards(SourceGeneration* gen, card mask, card unmask); - void visit_code_heap_roots(std::set* remembered_set); + + template + void cheneys_algorithm(TargetGeneration* gen, cell scan); }; template @@ -599,12 +600,21 @@ void slot_visitor::visit_cards(SourceGeneration* gen, template void slot_visitor::visit_code_heap_roots(std::set* remembered_set) { - FACTOR_FOR_EACH(*remembered_set) { - code_block* compiled = *iter; - visit_code_block_objects(compiled); - visit_embedded_literals(compiled); - compiled->flush_icache(); - } + FACTOR_FOR_EACH(*remembered_set) { + code_block* compiled = *iter; + visit_code_block_objects(compiled); + visit_embedded_literals(compiled); + compiled->flush_icache(); } +} + +template +template +void slot_visitor::cheneys_algorithm(TargetGeneration* gen, cell scan) { + while (scan && scan < gen->here) { + visit_object((object*)scan); + scan = gen->next_object_after(scan); + } +} } diff --git a/vm/to_tenured_collector.cpp b/vm/to_tenured_collector.cpp index d4b2b51d65..6490984c6e 100644 --- a/vm/to_tenured_collector.cpp +++ b/vm/to_tenured_collector.cpp @@ -4,30 +4,29 @@ namespace factor { void factor_vm::collect_to_tenured() { /* Copy live objects from aging space to tenured space. */ - collector collector(this, - data->tenured, - to_tenured_policy(this)); + gc_workhorse + workhorse(this, data->tenured, to_tenured_policy(this)); + slot_visitor> + visitor(this, workhorse); mark_stack.clear(); - collector.visitor.visit_all_roots(); + visitor.visit_all_roots(); gc_event* event = current_gc->event; if (event) event->reset_timer(); - collector.visitor.visit_cards(data->tenured, card_points_to_aging, 0xff); - if (event) { - event->ended_card_scan(collector.visitor.cards_scanned, - collector.visitor.decks_scanned); - } + visitor.visit_cards(data->tenured, card_points_to_aging, 0xff); + if (event) + event->ended_card_scan(visitor.cards_scanned, visitor.decks_scanned); if (event) event->reset_timer(); - collector.visitor.visit_code_heap_roots(&code->points_to_aging); + visitor.visit_code_heap_roots(&code->points_to_aging); if (event) event->ended_code_scan(code->points_to_aging.size()); - collector.visitor.visit_mark_stack(&mark_stack); + visitor.visit_mark_stack(&mark_stack); data->reset_nursery(); data->reset_aging();