vm: walk code roots from sample callstacks

db4
Joe Groff 2011-10-30 18:41:48 -07:00
parent 1089816b21
commit e3e2788414
4 changed files with 27 additions and 6 deletions

View File

@ -24,6 +24,9 @@ template<typename Fixup> 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<typename Fixup>
@ -133,4 +136,22 @@ void code_block_visitor<Fixup>::visit_uninitialized_code_blocks()
parent->code->uninitialized_blocks = new_uninitialized_blocks;
}
template<typename Fixup>
void code_block_visitor<Fixup>::visit_sample_callstacks()
{
for (std::vector<code_block *>::const_iterator iter = parent->sample_callstacks.begin();
iter != parent->sample_callstacks.end();
++iter)
{
fixup.fixup_code(*iter);
}
}
template<typename Fixup>
void code_block_visitor<Fixup>::visit_code_roots()
{
visit_uninitialized_code_blocks();
visit_sample_callstacks();
}
}

View File

@ -209,7 +209,7 @@ void factor_vm::collect_compact_impl(bool trace_contexts_p)
slot_visitor<compaction_fixup> data_forwarder(this,fixup);
code_block_visitor<compaction_fixup> 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<code_compaction_fixup> data_forwarder(this,fixup);
code_block_visitor<code_compaction_fixup> 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();

View File

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

View File

@ -31,7 +31,7 @@ struct full_collector : collector<tenured_space,full_policy> {
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);
};