vm: don't call nano_count() from the GC at all, unless GC event recording is on

db4
Slava Pestov 2010-09-04 13:21:45 -07:00
parent d2cf2d8f92
commit 2498a4d881
8 changed files with 61 additions and 37 deletions

View File

@ -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();
}

View File

@ -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 {

View File

@ -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);
}

View File

@ -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_)
{
event = new gc_event(op,parent);
if(parent->gc_events)
{
event = new gc_event(op,parent);
start_time = nano_count();
}
else
event = NULL;
}
gc_state::~gc_state()
{
delete event;
event = NULL;
if(event)
{
delete event;
event = NULL;
}
}
void factor_vm::end_gc()
{
current_gc->event->ended_gc(this);
if(gc_events) gc_events->push_back(*current_gc->event);
delete current_gc->event;
current_gc->event = NULL;
if(gc_events)
{
current_gc->event->ended_gc(this);
gc_events->push_back(*current_gc->event);
}
}
void factor_vm::start_gc_again()
@ -123,7 +133,14 @@ void factor_vm::start_gc_again()
break;
}
current_gc->event = new gc_event(current_gc->op,this);
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)
@ -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;

View File

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

View File

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

View File

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

View File

@ -299,6 +299,7 @@ struct factor_vm
// gc
void end_gc();
void set_current_gc_op(gc_op op);
void start_gc_again();
void update_code_heap_for_minor_gc(std::set<code_block *> *remembered_set);
void collect_nursery();