]> gitweb.factorcode.org Git - factor.git/commitdiff
vm: make compaction its own gc_op
authorSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Sun, 25 Oct 2009 19:02:14 +0000 (14:02 -0500)
committerSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Sun, 25 Oct 2009 19:02:14 +0000 (14:02 -0500)
vm/compaction.cpp
vm/full_collector.cpp
vm/gc.cpp
vm/gc.hpp
vm/image.cpp
vm/vm.hpp

index 74dd8935da56a96ea44e930b73110e5682bedabe..399971805b7e673c25a533b2a62406433fc8fdea 100644 (file)
@@ -110,7 +110,7 @@ struct code_block_compaction_updater {
        }
 };
 
-void factor_vm::collect_full_compact(bool trace_contexts_p)
+void factor_vm::collect_compact_impl(bool trace_contexts_p)
 {
        tenured_space *tenured = data->tenured;
        mark_bits<object> *data_forwarding_map = &tenured->state;
index 65d0edbd475c217f439860f60768e4f44769de8b..09e32574fd35e6b4f882dd2e9e6fe51ea2a5a1d2 100644 (file)
@@ -40,7 +40,7 @@ struct object_start_map_updater {
        }
 };
 
-void factor_vm::collect_full_mark(bool trace_contexts_p)
+void factor_vm::collect_mark_impl(bool trace_contexts_p)
 {
        full_collector collector(this);
 
@@ -74,43 +74,21 @@ void factor_vm::collect_full_mark(bool trace_contexts_p)
        code->clear_remembered_set();
 }
 
-void factor_vm::collect_full_sweep()
+void factor_vm::collect_sweep_impl()
 {
        data->tenured->starts.clear_object_start_offsets();
        object_start_map_updater updater(&data->tenured->starts);
        data->tenured->sweep(updater);
 }
 
-void factor_vm::collect_growing_heap(cell requested_bytes,
-       bool trace_contexts_p,
-       bool compact_p)
+void factor_vm::collect_growing_heap(cell requested_bytes, bool trace_contexts_p)
 {
        /* Grow the data heap and copy all live objects to the new heap. */
        data_heap *old = data;
        set_data_heap(data->grow(requested_bytes));
-       collect_full_mark(trace_contexts_p);
+       collect_mark_impl(trace_contexts_p);
+       collect_compact_impl(trace_contexts_p);
        delete old;
-
-       if(compact_p)
-               collect_full_compact(trace_contexts_p);
-       else
-       {
-               collect_full_sweep();
-               relocate_code_heap();
-       }
-}
-
-void factor_vm::collect_full(bool trace_contexts_p, bool compact_p)
-{
-       collect_full_mark(trace_contexts_p);
-
-       if(compact_p)
-               collect_full_compact(trace_contexts_p);
-       else
-       {
-               collect_full_sweep();
-               update_code_heap_words_and_literals();
-       }
 }
 
 }
index 4b530172c1ddd541a9b44399291d081d037c1a17..2c361bcd19cf74b65e9960e068d5b057b2204b99 100755 (executable)
--- a/vm/gc.cpp
+++ b/vm/gc.cpp
@@ -25,10 +25,7 @@ void factor_vm::record_gc_stats(generation_statistics *stats)
                stats->max_gc_time = gc_elapsed;
 }
 
-void factor_vm::gc(gc_op op,
-       cell requested_bytes,
-       bool trace_contexts_p,
-       bool compact_p)
+void factor_vm::gc(gc_op op, cell requested_bytes, bool trace_contexts_p)
 {
        assert(!gc_off);
        assert(!current_gc);
@@ -57,6 +54,7 @@ void factor_vm::gc(gc_op op,
                        current_gc->op = collect_full_op;
                        break;
                case collect_full_op:
+               case collect_compact_op:
                        current_gc->op = collect_growing_heap_op;
                        break;
                default:
@@ -83,11 +81,18 @@ void factor_vm::gc(gc_op op,
                record_gc_stats(&gc_stats.aging_stats);
                break;
        case collect_full_op:
-               collect_full(trace_contexts_p,compact_p);
+               collect_mark_impl(trace_contexts_p);
+               collect_sweep_impl();
+               update_code_heap_words_and_literals();
+               record_gc_stats(&gc_stats.full_stats);
+               break;
+       case collect_compact_op:
+               collect_mark_impl(trace_contexts_p);
+               collect_compact_impl(trace_contexts_p);
                record_gc_stats(&gc_stats.full_stats);
                break;
        case collect_growing_heap_op:
-               collect_growing_heap(requested_bytes,trace_contexts_p,compact_p);
+               collect_growing_heap(requested_bytes,trace_contexts_p);
                record_gc_stats(&gc_stats.full_stats);
                break;
        default:
@@ -106,24 +111,21 @@ void factor_vm::primitive_minor_gc()
 {
        gc(collect_nursery_op,
                0, /* requested size */
-               true, /* trace contexts? */
-               false /* compact code heap? */);
+               true /* trace contexts? */);
 }
 
 void factor_vm::primitive_full_gc()
 {
        gc(collect_full_op,
                0, /* requested size */
-               true, /* trace contexts? */
-               true /* compact code heap? */);
+               true /* trace contexts? */);
 }
 
 void factor_vm::primitive_compact_gc()
 {
-       gc(collect_full_op,
+       gc(collect_compact_op,
                0, /* requested size */
-               true, /* trace contexts? */
-               true /* compact code heap? */);
+               true /* trace contexts? */);
 }
 
 void factor_vm::add_gc_stats(generation_statistics *stats, growable_array *result)
@@ -251,8 +253,7 @@ object *factor_vm::allot_object(header header, cell size)
                        {
                                gc(collect_growing_heap_op,
                                        size, /* requested size */
-                                       true, /* trace contexts? */
-                                       false /* compact code heap? */);
+                                       true /* trace contexts? */);
                        }
                }
 
index 18b926ed8caccdb42f8989c068ab115a52069f11..a4162ed6203270bb047154689ef5eb9fda82b145 100755 (executable)
--- a/vm/gc.hpp
+++ b/vm/gc.hpp
@@ -6,6 +6,7 @@ enum gc_op {
        collect_aging_op,
        collect_to_tenured_op,
        collect_full_op,
+       collect_compact_op,
        collect_growing_heap_op
 };
 
index 2e4433d3b5e050fb253370faef24e79e26e517ea..c35c0a32b8c2c2f86669efc687a4c563b46d9871 100755 (executable)
@@ -327,10 +327,9 @@ void factor_vm::primitive_save_image_and_exit()
        for(cell i = 0; i < special_object_count; i++)
                if(!save_env_p(i)) special_objects[i] = false_object;
 
-       gc(collect_full_op,
+       gc(collect_compact_op,
                0, /* requested size */
-               false, /* discard objects only reachable from stacks */
-               true /* compact the code heap */);
+               false /* discard objects only reachable from stacks */);
 
        /* Save the image */
        if(save_image((vm_char *)(path.untagged() + 1)))
index f0f37619d2443e8394e995e6a3b21f68a2e0ec74..0124affefadf1dcb50133ddd78b08fd5ec1391d2 100755 (executable)
--- a/vm/vm.hpp
+++ b/vm/vm.hpp
@@ -247,13 +247,12 @@ struct factor_vm
        void collect_nursery();
        void collect_aging();
        void collect_to_tenured();
-       void collect_full_mark(bool trace_contexts_p);
-       void collect_full_sweep();
-       void collect_full_compact(bool trace_contexts_p);
-       void collect_growing_heap(cell requested_bytes, bool trace_contexts_p, bool compact_p);
-       void collect_full(bool trace_contexts_p, bool compact_p);
+       void collect_mark_impl(bool trace_contexts_p);
+       void collect_sweep_impl();
+       void collect_compact_impl(bool trace_contexts_p);
+       void collect_growing_heap(cell requested_bytes, bool trace_contexts_p);
        void record_gc_stats(generation_statistics *stats);
-       void gc(gc_op op, cell requested_bytes, bool trace_contexts_p, bool compact_p);
+       void gc(gc_op op, cell requested_bytes, bool trace_contexts_p);
        void primitive_minor_gc();
        void primitive_full_gc();
        void primitive_compact_gc();