From 89d52369801189ceab62fe8f8157eb6ad8ec6c33 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Sun, 30 Oct 2011 18:41:48 -0700 Subject: [PATCH] vm: walk code roots from sample callstacks --- vm/code_block_visitor.hpp | 21 +++++++++++++++++++++ vm/compaction.cpp | 4 ++-- vm/full_collector.cpp | 6 +++--- vm/full_collector.hpp | 2 +- 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/vm/code_block_visitor.hpp b/vm/code_block_visitor.hpp index 6246c748e9..e321ae478b 100644 --- a/vm/code_block_visitor.hpp +++ b/vm/code_block_visitor.hpp @@ -24,6 +24,9 @@ template struct code_block_visitor { void visit_embedded_code_pointers(code_block *compiled); void visit_context_code_blocks(); void visit_uninitialized_code_blocks(); + void visit_sample_callstacks(); + + void visit_code_roots(); }; template @@ -133,4 +136,22 @@ void code_block_visitor::visit_uninitialized_code_blocks() parent->code->uninitialized_blocks = new_uninitialized_blocks; } +template +void code_block_visitor::visit_sample_callstacks() +{ + for (std::vector::const_iterator iter = parent->sample_callstacks.begin(); + iter != parent->sample_callstacks.end(); + ++iter) + { + fixup.fixup_code(*iter); + } +} + +template +void code_block_visitor::visit_code_roots() +{ + visit_uninitialized_code_blocks(); + visit_sample_callstacks(); +} + } diff --git a/vm/compaction.cpp b/vm/compaction.cpp index 3d1ed89a47..4c59a38886 100644 --- a/vm/compaction.cpp +++ b/vm/compaction.cpp @@ -209,7 +209,7 @@ void factor_vm::collect_compact_impl(bool trace_contexts_p) slot_visitor data_forwarder(this,fixup); code_block_visitor code_forwarder(this,fixup); - code_forwarder.visit_uninitialized_code_blocks(); + code_forwarder.visit_code_roots(); /* Object start offsets get recomputed by the object_compaction_updater */ data->tenured->starts.clear_object_start_offsets(); @@ -308,7 +308,7 @@ void factor_vm::collect_compact_code_impl(bool trace_contexts_p) slot_visitor data_forwarder(this,fixup); code_block_visitor code_forwarder(this,fixup); - code_forwarder.visit_uninitialized_code_blocks(); + code_forwarder.visit_code_roots(); if(trace_contexts_p) code_forwarder.visit_context_code_blocks(); diff --git a/vm/full_collector.cpp b/vm/full_collector.cpp index 71f04cf6ce..f53760ceca 100644 --- a/vm/full_collector.cpp +++ b/vm/full_collector.cpp @@ -19,9 +19,9 @@ void full_collector::trace_context_code_blocks() code_visitor.visit_context_code_blocks(); } -void full_collector::trace_uninitialized_code_blocks() +void full_collector::trace_code_roots() { - code_visitor.visit_uninitialized_code_blocks(); + code_visitor.visit_code_roots(); } void full_collector::trace_object_code_block(object *obj) @@ -63,7 +63,7 @@ void factor_vm::collect_mark_impl(bool trace_contexts_p) { collector.trace_contexts(); collector.trace_context_code_blocks(); - collector.trace_uninitialized_code_blocks(); + collector.trace_code_roots(); } while(!mark_stack.empty()) diff --git a/vm/full_collector.hpp b/vm/full_collector.hpp index 82a057ddbf..71c4f5334b 100644 --- a/vm/full_collector.hpp +++ b/vm/full_collector.hpp @@ -31,7 +31,7 @@ struct full_collector : collector { explicit full_collector(factor_vm *parent_); void trace_code_block(code_block *compiled); void trace_context_code_blocks(); - void trace_uninitialized_code_blocks(); + void trace_code_roots(); void trace_object_code_block(object *obj); };