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();
}
/* 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;
update_code_roots_for_compaction();
callbacks->update();
- current_gc->event->ended_compaction();
+ if(event) event->ended_compaction();
}
struct code_compaction_fixup {
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)
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);
}
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()
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)
{
try
{
- current_gc->event->op = current_gc->op;
+ if(gc_events) current_gc->event->op = current_gc->op;
switch(current_gc->op)
{
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;
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;
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();
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));
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();
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();
// 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();