vm: don't call nano_count() from the GC at all, unless GC event recording is on
parent
d2cf2d8f92
commit
2498a4d881
|
@ -22,15 +22,17 @@ void factor_vm::collect_aging()
|
|||
|
||||
to_tenured_collector collector(this);
|
||||
|
||||
current_gc->event->started_card_scan();
|
||||
gc_event *event = current_gc->event;
|
||||
|
||||
if(event) event->started_card_scan();
|
||||
collector.trace_cards(data->tenured,
|
||||
card_points_to_aging,
|
||||
full_unmarker());
|
||||
current_gc->event->ended_card_scan(collector.cards_scanned,collector.decks_scanned);
|
||||
if(event) event->ended_card_scan(collector.cards_scanned,collector.decks_scanned);
|
||||
|
||||
current_gc->event->started_code_scan();
|
||||
if(event) event->started_code_scan();
|
||||
collector.trace_code_heap_roots(&code->points_to_aging);
|
||||
current_gc->event->ended_code_scan(collector.code_blocks_scanned);
|
||||
if(event) event->ended_code_scan(collector.code_blocks_scanned);
|
||||
|
||||
collector.tenure_reachable_objects();
|
||||
}
|
||||
|
|
|
@ -190,7 +190,9 @@ void factor_vm::update_code_roots_for_compaction()
|
|||
/* Compact data and code heaps */
|
||||
void factor_vm::collect_compact_impl(bool trace_contexts_p)
|
||||
{
|
||||
current_gc->event->started_compaction();
|
||||
gc_event *event = current_gc->event;
|
||||
|
||||
if(event) event->started_compaction();
|
||||
|
||||
tenured_space *tenured = data->tenured;
|
||||
mark_bits<object> *data_forwarding_map = &tenured->state;
|
||||
|
@ -232,7 +234,7 @@ void factor_vm::collect_compact_impl(bool trace_contexts_p)
|
|||
update_code_roots_for_compaction();
|
||||
callbacks->update();
|
||||
|
||||
current_gc->event->ended_compaction();
|
||||
if(event) event->ended_compaction();
|
||||
}
|
||||
|
||||
struct code_compaction_fixup {
|
||||
|
|
|
@ -92,15 +92,17 @@ void factor_vm::collect_mark_impl(bool trace_contexts_p)
|
|||
|
||||
void factor_vm::collect_sweep_impl()
|
||||
{
|
||||
current_gc->event->started_data_sweep();
|
||||
gc_event *event = current_gc->event;
|
||||
|
||||
if(event) event->started_data_sweep();
|
||||
data->tenured->sweep();
|
||||
current_gc->event->ended_data_sweep();
|
||||
if(event) event->ended_data_sweep();
|
||||
|
||||
update_code_roots_for_sweep();
|
||||
|
||||
current_gc->event->started_code_sweep();
|
||||
if(event) event->started_code_sweep();
|
||||
code->allocator->sweep();
|
||||
current_gc->event->ended_code_sweep();
|
||||
if(event) event->ended_code_sweep();
|
||||
}
|
||||
|
||||
void factor_vm::collect_full(bool trace_contexts_p)
|
||||
|
@ -110,14 +112,12 @@ void factor_vm::collect_full(bool trace_contexts_p)
|
|||
|
||||
if(data->low_memory_p())
|
||||
{
|
||||
current_gc->op = collect_growing_heap_op;
|
||||
current_gc->event->op = collect_growing_heap_op;
|
||||
set_current_gc_op(collect_growing_heap_op);
|
||||
collect_growing_heap(0,trace_contexts_p);
|
||||
}
|
||||
else if(data->high_fragmentation_p())
|
||||
{
|
||||
current_gc->op = collect_compact_op;
|
||||
current_gc->event->op = collect_compact_op;
|
||||
set_current_gc_op(collect_compact_op);
|
||||
collect_compact_impl(trace_contexts_p);
|
||||
}
|
||||
|
||||
|
|
33
vm/gc.cpp
33
vm/gc.cpp
|
@ -80,23 +80,33 @@ void gc_event::ended_gc(factor_vm *parent)
|
|||
total_time = (cell)(nano_count() - start_time);
|
||||
}
|
||||
|
||||
gc_state::gc_state(gc_op op_, factor_vm *parent) : op(op_), start_time(nano_count())
|
||||
gc_state::gc_state(gc_op op_, factor_vm *parent) : op(op_)
|
||||
{
|
||||
if(parent->gc_events)
|
||||
{
|
||||
event = new gc_event(op,parent);
|
||||
start_time = nano_count();
|
||||
}
|
||||
else
|
||||
event = NULL;
|
||||
}
|
||||
|
||||
gc_state::~gc_state()
|
||||
{
|
||||
if(event)
|
||||
{
|
||||
delete event;
|
||||
event = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void factor_vm::end_gc()
|
||||
{
|
||||
if(gc_events)
|
||||
{
|
||||
current_gc->event->ended_gc(this);
|
||||
if(gc_events) gc_events->push_back(*current_gc->event);
|
||||
delete current_gc->event;
|
||||
current_gc->event = NULL;
|
||||
gc_events->push_back(*current_gc->event);
|
||||
}
|
||||
}
|
||||
|
||||
void factor_vm::start_gc_again()
|
||||
|
@ -123,9 +133,16 @@ void factor_vm::start_gc_again()
|
|||
break;
|
||||
}
|
||||
|
||||
if(gc_events)
|
||||
current_gc->event = new gc_event(current_gc->op,this);
|
||||
}
|
||||
|
||||
void factor_vm::set_current_gc_op(gc_op op)
|
||||
{
|
||||
current_gc->op = op;
|
||||
if(gc_events) current_gc->event->op = op;
|
||||
}
|
||||
|
||||
void factor_vm::gc(gc_op op, cell requested_bytes, bool trace_contexts_p)
|
||||
{
|
||||
/* Save and reset FPU state before, restore it after, so that
|
||||
|
@ -144,7 +161,7 @@ void factor_vm::gc(gc_op op, cell requested_bytes, bool trace_contexts_p)
|
|||
{
|
||||
try
|
||||
{
|
||||
current_gc->event->op = current_gc->op;
|
||||
if(gc_events) current_gc->event->op = current_gc->op;
|
||||
|
||||
switch(current_gc->op)
|
||||
{
|
||||
|
@ -155,8 +172,7 @@ void factor_vm::gc(gc_op op, cell requested_bytes, bool trace_contexts_p)
|
|||
collect_aging();
|
||||
if(data->high_fragmentation_p())
|
||||
{
|
||||
current_gc->op = collect_full_op;
|
||||
current_gc->event->op = collect_full_op;
|
||||
set_current_gc_op(collect_full_op);
|
||||
collect_full(trace_contexts_p);
|
||||
}
|
||||
break;
|
||||
|
@ -164,8 +180,7 @@ void factor_vm::gc(gc_op op, cell requested_bytes, bool trace_contexts_p)
|
|||
collect_to_tenured();
|
||||
if(data->high_fragmentation_p())
|
||||
{
|
||||
current_gc->op = collect_full_op;
|
||||
current_gc->event->op = collect_full_op;
|
||||
set_current_gc_op(collect_full_op);
|
||||
collect_full(trace_contexts_p);
|
||||
}
|
||||
break;
|
||||
|
|
|
@ -28,7 +28,7 @@ struct gc_event {
|
|||
cell compaction_time;
|
||||
u64 temp_time;
|
||||
|
||||
explicit gc_event(gc_op op_, factor_vm *parent);
|
||||
gc_event(gc_op op_, factor_vm *parent);
|
||||
void started_card_scan();
|
||||
void ended_card_scan(cell cards_scanned_, cell decks_scanned_);
|
||||
void started_code_scan();
|
||||
|
|
|
@ -18,7 +18,9 @@ void factor_vm::collect_nursery()
|
|||
collector.trace_roots();
|
||||
collector.trace_contexts();
|
||||
|
||||
current_gc->event->started_card_scan();
|
||||
gc_event *event = current_gc->event;
|
||||
|
||||
if(event) event->started_card_scan();
|
||||
collector.trace_cards(data->tenured,
|
||||
card_points_to_nursery,
|
||||
simple_unmarker(card_points_to_nursery));
|
||||
|
@ -28,11 +30,11 @@ void factor_vm::collect_nursery()
|
|||
card_points_to_nursery,
|
||||
full_unmarker());
|
||||
}
|
||||
current_gc->event->ended_card_scan(collector.cards_scanned,collector.decks_scanned);
|
||||
if(event) event->ended_card_scan(collector.cards_scanned,collector.decks_scanned);
|
||||
|
||||
current_gc->event->started_code_scan();
|
||||
if(event) event->started_code_scan();
|
||||
collector.trace_code_heap_roots(&code->points_to_nursery);
|
||||
current_gc->event->ended_code_scan(collector.code_blocks_scanned);
|
||||
if(event) event->ended_code_scan(collector.code_blocks_scanned);
|
||||
|
||||
collector.cheneys_algorithm();
|
||||
|
||||
|
|
|
@ -30,15 +30,17 @@ void factor_vm::collect_to_tenured()
|
|||
collector.trace_roots();
|
||||
collector.trace_contexts();
|
||||
|
||||
current_gc->event->started_card_scan();
|
||||
gc_event *event = current_gc->event;
|
||||
|
||||
if(event) event->started_card_scan();
|
||||
collector.trace_cards(data->tenured,
|
||||
card_points_to_aging,
|
||||
full_unmarker());
|
||||
current_gc->event->ended_card_scan(collector.cards_scanned,collector.decks_scanned);
|
||||
if(event) event->ended_card_scan(collector.cards_scanned,collector.decks_scanned);
|
||||
|
||||
current_gc->event->started_code_scan();
|
||||
if(event) event->started_code_scan();
|
||||
collector.trace_code_heap_roots(&code->points_to_aging);
|
||||
current_gc->event->ended_code_scan(collector.code_blocks_scanned);
|
||||
if(event) event->ended_code_scan(collector.code_blocks_scanned);
|
||||
|
||||
collector.tenure_reachable_objects();
|
||||
|
||||
|
|
Loading…
Reference in New Issue