]> gitweb.factorcode.org Git - factor.git/commitdiff
vm: sample code block owners instead of blocks
authorJoe Groff <arcata@gmail.com>
Wed, 2 Nov 2011 01:53:37 +0000 (18:53 -0700)
committerJoe Groff <arcata@gmail.com>
Wed, 2 Nov 2011 20:23:17 +0000 (13:23 -0700)
vm/code_block_visitor.hpp
vm/sampling_profiler.cpp
vm/slot_visitor.hpp
vm/vm.hpp

index 50d4a96a7da3674f9361232845b45aeae969f7a5..d43daa3ad3d5b65e322b821acdd0ff9472167c50 100644 (file)
@@ -24,7 +24,6 @@ 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();
 };
@@ -136,22 +135,10 @@ 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 *>::iterator iter = parent->sample_callstacks.begin();
-               iter != parent->sample_callstacks.end();
-               ++iter)
-       {
-               *iter = fixup.fixup_code(*iter);
-       }
-}
-
 template<typename Fixup>
 void code_block_visitor<Fixup>::visit_code_roots()
 {
        visit_uninitialized_code_blocks();
-       visit_sample_callstacks();
 }
 
 }
index 48052888fdb7bb8076b6fff4587e23885a1e68c5..24ac5c8bdef10024ffc5fc2d1638e33f9f2c514a 100644 (file)
@@ -50,7 +50,7 @@ void factor_vm::record_callstack_sample(cell *begin, cell *end)
        stack_frame *frame = ctx->bottom_frame();
 
        while (frame >= ctx->callstack_top) {
-               sample_callstacks.push_back(frame_code(frame));
+               sample_callstacks.push_back(frame_code(frame)->owner);
                frame = frame_successor(frame);
        }
 
@@ -74,7 +74,7 @@ void factor_vm::clear_samples()
        // Swapping into temporaries releases the vector's allocated storage,
        // whereas clear() would leave the allocation as-is
        std::vector<profiling_sample> sample_graveyard;
-       std::vector<code_block*> sample_callstack_graveyard;
+       std::vector<cell> sample_callstack_graveyard;
        samples.swap(sample_graveyard);
        sample_callstacks.swap(sample_callstack_graveyard);
 }
@@ -127,14 +127,14 @@ void factor_vm::primitive_get_samples()
                        cell callstack_size = from_iter->callstack_end - from_iter->callstack_begin;
                        data_root<array> callstack(allot_array(callstack_size,false_object),this);
 
-                       std::vector<code_block*>::const_iterator
+                       std::vector<cell>::const_iterator
                                callstacks_begin = sample_callstacks.begin(),
                                c_from_iter = callstacks_begin + from_iter->callstack_begin,
                                c_from_iter_end = callstacks_begin + from_iter->callstack_end;
                        cell c_to_i = 0;
 
                        for (; c_from_iter != c_from_iter_end; ++c_from_iter, ++c_to_i)
-                               set_array_nth(callstack.untagged(),c_to_i,(*c_from_iter)->owner);
+                               set_array_nth(callstack.untagged(),c_to_i,*c_from_iter);
 
                        set_array_nth(sample.untagged(),5,callstack.value());
 
index b2dd40e58230c64456fc275fc8c8fbf1a649d0a0..b2fd5d3c4b033ebd5899e11d69bee3c8bcb0cec0 100755 (executable)
@@ -134,6 +134,7 @@ template<typename Fixup> struct slot_visitor {
        void visit_contexts();
        void visit_code_block_objects(code_block *compiled);
        void visit_embedded_literals(code_block *compiled);
+       void visit_sample_callstacks();
 };
 
 template<typename Fixup>
@@ -249,6 +250,17 @@ void slot_visitor<Fixup>::visit_literal_table_roots()
        parent->code->uninitialized_blocks = new_uninitialized_blocks;
 }
 
+template<typename Fixup>
+void slot_visitor<Fixup>::visit_sample_callstacks()
+{
+       for (std::vector<cell>::iterator iter = parent->sample_callstacks.begin();
+               iter != parent->sample_callstacks.end();
+               ++iter)
+       {
+               visit_handle(&*iter);
+       }
+}
+
 template<typename Fixup>
 void slot_visitor<Fixup>::visit_roots()
 {
@@ -261,6 +273,7 @@ void slot_visitor<Fixup>::visit_roots()
        visit_bignum_roots();
        visit_callback_roots();
        visit_literal_table_roots();
+       visit_sample_callstacks();
 
        visit_object_array(parent->special_objects,parent->special_objects + special_object_count);
 }
index f4c765d6450746b189355f570e985861bdc3925a..08195a81e72252cbe577e9f6ffc9e301381704d3 100755 (executable)
--- a/vm/vm.hpp
+++ b/vm/vm.hpp
@@ -75,7 +75,7 @@ struct factor_vm
 
        /* State kept by the sampling profiler */
        std::vector<profiling_sample> samples;
-       std::vector<code_block*> sample_callstacks;
+       std::vector<cell> sample_callstacks;
        volatile profiling_sample_count safepoint_sample_counts;
 
        /* GC is off during heap walking */