From 2498a4d8810ee01507c41932573991a52dbc5037 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Sat, 4 Sep 2010 13:21:45 -0700 Subject: [PATCH] vm: don't call nano_count() from the GC at all, unless GC event recording is on --- vm/aging_collector.cpp | 10 +++++---- vm/compaction.cpp | 6 ++++-- vm/full_collector.cpp | 16 +++++++------- vm/gc.cpp | 43 +++++++++++++++++++++++++------------ vm/gc.hpp | 2 +- vm/nursery_collector.cpp | 10 +++++---- vm/to_tenured_collector.cpp | 10 +++++---- vm/vm.hpp | 1 + 8 files changed, 61 insertions(+), 37 deletions(-) diff --git a/vm/aging_collector.cpp b/vm/aging_collector.cpp index c832ca792f..c747592f42 100644 --- a/vm/aging_collector.cpp +++ b/vm/aging_collector.cpp @@ -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(); } diff --git a/vm/compaction.cpp b/vm/compaction.cpp index 9d26062a5c..343a61b8ba 100644 --- a/vm/compaction.cpp +++ b/vm/compaction.cpp @@ -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 *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 { diff --git a/vm/full_collector.cpp b/vm/full_collector.cpp index 19d8b576a5..852c058bd2 100644 --- a/vm/full_collector.cpp +++ b/vm/full_collector.cpp @@ -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); } diff --git a/vm/gc.cpp b/vm/gc.cpp index d898ba89af..866a19f7f6 100755 --- a/vm/gc.cpp +++ b/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_) { - 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; diff --git a/vm/gc.hpp b/vm/gc.hpp index f6e9a875a6..76029d81ee 100755 --- a/vm/gc.hpp +++ b/vm/gc.hpp @@ -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(); diff --git a/vm/nursery_collector.cpp b/vm/nursery_collector.cpp index 062aa6aed3..7ea81391b2 100644 --- a/vm/nursery_collector.cpp +++ b/vm/nursery_collector.cpp @@ -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(); diff --git a/vm/to_tenured_collector.cpp b/vm/to_tenured_collector.cpp index b29affc480..4d11cdb27b 100644 --- a/vm/to_tenured_collector.cpp +++ b/vm/to_tenured_collector.cpp @@ -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(); diff --git a/vm/vm.hpp b/vm/vm.hpp index 682ab873b7..44ac81a70c 100755 --- a/vm/vm.hpp +++ b/vm/vm.hpp @@ -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 *remembered_set); void collect_nursery();