]> gitweb.factorcode.org Git - factor.git/commitdiff
vm: walk code roots from sample callstacks
authorJoe Groff <arcata@gmail.com>
Mon, 31 Oct 2011 01:41:48 +0000 (18:41 -0700)
committerJoe Groff <arcata@gmail.com>
Wed, 2 Nov 2011 20:23:08 +0000 (13:23 -0700)
vm/code_block_visitor.hpp
vm/compaction.cpp
vm/full_collector.cpp
vm/full_collector.hpp

index 6246c748e9956698f746f199471be4c1dedca4b0..e321ae478bfe5cc8fa45419c2de2b268accd436a 100644 (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();
+}
+
 }
index 3d1ed89a4777f3129ac49bb17c3044a17d3072aa..4c59a38886fe0f82e07066ac47d51078b885bb3b 100644 (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();
index 71f04cf6ce1025a2b1dab2b2885f12115a5cacd7..f53760cecafa7a5e1067cb4ed08b8233707aa22d 100644 (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())
index 82a057ddbfb726a5077d5971c20b60b601627b90..71c4f5334bbe019430cd70c71a7088213109af4d 100644 (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);
 };