]> gitweb.factorcode.org Git - factor.git/commitdiff
vm: fix issue with unnecessary heap growth
authorSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Wed, 4 Nov 2009 04:25:22 +0000 (22:25 -0600)
committerSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Wed, 4 Nov 2009 04:25:22 +0000 (22:25 -0600)
vm/code_block.cpp
vm/data_heap.cpp
vm/data_heap.hpp
vm/full_collector.cpp
vm/gc.cpp
vm/vm.hpp

index 98696307320c6deec1c0c75bb831642d9acc18f2..56dd27c6b716d14f231f375a8ccceaaa288c623c 100755 (executable)
@@ -127,9 +127,8 @@ void *factor_vm::get_rel_symbol(array *literals, cell index)
                }
        case ARRAY_TYPE:
                {
-                       cell i;
                        array *names = untag<array>(symbol);
-                       for(i = 0; i < array_capacity(names); i++)
+                       for(cell i = 0; i < array_capacity(names); i++)
                        {
                                symbol_char *name = alien_offset(array_nth(names,i));
                                void *sym = ffi_dlsym(d,name);
index 21008af5cb047f43eaf39440fb1bb1e71cb8eec9..bb705e276c59cc0ea15b14d883132f71010e2ef5 100755 (executable)
@@ -98,6 +98,11 @@ void data_heap::reset_generation(tenured_space *gen)
        clear_decks(gen);
 }
 
+bool data_heap::low_memory_p()
+{
+       return (tenured->free_space() <= nursery->size + aging->size);
+}
+
 void factor_vm::set_data_heap(data_heap *data_)
 {
        data = data_;
index a4340248730dbb8198b024a16ebd2eb9dbb86271..760a10942e34737dcf191766a3b4c49a2034dbe3 100755 (executable)
@@ -29,6 +29,7 @@ struct data_heap {
        void reset_generation(nursery_space *gen);
        void reset_generation(aging_space *gen);
        void reset_generation(tenured_space *gen);
+       bool low_memory_p();
 };
 
 struct data_heap_room {
index dfc1b563bd6daae4269d0d28f193f8c27fef744b..3b92e2574e865fb620aa7cc8bdca1d1524e3d9db 100644 (file)
@@ -118,6 +118,22 @@ void factor_vm::collect_sweep_impl()
        current_gc->event->ended_data_sweep();
 }
 
+void factor_vm::collect_full(bool trace_contexts_p)
+{
+       collect_mark_impl(trace_contexts_p);
+       collect_sweep_impl();
+       if(data->tenured->largest_free_block() <= data->nursery->size + data->aging->size)
+               collect_compact_impl(trace_contexts_p);
+       else
+               update_code_heap_words_and_literals();
+}
+
+void factor_vm::collect_compact(bool trace_contexts_p)
+{
+       collect_mark_impl(trace_contexts_p);
+       collect_compact_impl(trace_contexts_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. */
index 06e9d78ce28d0386a8ba6c3af6680ec7af7d4466..de8a2886f70574b7c12dbd9c4bc1f5d2139a92e8 100755 (executable)
--- a/vm/gc.cpp
+++ b/vm/gc.cpp
@@ -152,12 +152,6 @@ void factor_vm::gc(gc_op op, cell requested_bytes, bool trace_contexts_p)
                start_gc_again();
        }
 
-       if(current_gc->op == collect_aging_op || current_gc->op == collect_to_tenured_op)
-       {
-               if(data->tenured->free_space() <= data->nursery->size + data->aging->size)
-                       current_gc->op = collect_full_op;
-       }
-
        current_gc->event->op = current_gc->op;
 
        switch(current_gc->op)
@@ -167,21 +161,27 @@ void factor_vm::gc(gc_op op, cell requested_bytes, bool trace_contexts_p)
                break;
        case collect_aging_op:
                collect_aging();
+               if(data->low_memory_p())
+               {
+                       current_gc->op = collect_full_op;
+                       current_gc->event->op = collect_full_op;
+                       collect_full(trace_contexts_p);
+               }
                break;
        case collect_to_tenured_op:
                collect_to_tenured();
+               if(data->low_memory_p())
+               {
+                       current_gc->op = collect_full_op;
+                       current_gc->event->op = collect_full_op;
+                       collect_full(trace_contexts_p);
+               }
                break;
        case collect_full_op:
-               collect_mark_impl(trace_contexts_p);
-               collect_sweep_impl();
-               if(data->tenured->largest_free_block() <= data->nursery->size + data->aging->size)
-                       collect_compact_impl(trace_contexts_p);
-               else
-                       update_code_heap_words_and_literals();
+               collect_full(trace_contexts_p);
                break;
        case collect_compact_op:
-               collect_mark_impl(trace_contexts_p);
-               collect_compact_impl(trace_contexts_p);
+               collect_compact(trace_contexts_p);
                break;
        case collect_growing_heap_op:
                collect_growing_heap(requested_bytes,trace_contexts_p);
index 0789590c492c62feed975371e58210a520147351..aa04c8dffcae5712a2ee68fa6e2c52cc713d2bde 100755 (executable)
--- a/vm/vm.hpp
+++ b/vm/vm.hpp
@@ -262,8 +262,10 @@ struct factor_vm
        void update_code_roots_for_compaction();
        void collect_mark_impl(bool trace_contexts_p);
        void collect_sweep_impl();
+       void collect_full(bool trace_contexts_p);
        void collect_compact_impl(bool trace_contexts_p);
        void collect_compact_code_impl(bool trace_contexts_p);
+       void collect_compact(bool trace_contexts_p);
        void collect_growing_heap(cell requested_bytes, bool trace_contexts_p);
        void gc(gc_op op, cell requested_bytes, bool trace_contexts_p);
        void primitive_minor_gc();