]> gitweb.factorcode.org Git - factor.git/commitdiff
vm: grow the heap if a full collection doesn't reclaim enough space
authorSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Sun, 6 Dec 2009 00:03:53 +0000 (19:03 -0500)
committerSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Sun, 6 Dec 2009 00:03:53 +0000 (19:03 -0500)
vm/data_heap.cpp
vm/data_heap.hpp
vm/full_collector.cpp
vm/gc.cpp

index 7234ffb775aa4173dc4cf7847b021d4a15455285..aa7e3eb51a15fe38b5c88518cd703e272e2fc5a2 100755 (executable)
@@ -98,11 +98,16 @@ void data_heap::reset_generation(tenured_space *gen)
        clear_decks(gen);
 }
 
-bool data_heap::low_memory_p()
+bool data_heap::high_fragmentation_p()
 {
        return (tenured->largest_free_block() <= nursery->size + aging->size);
 }
 
+bool data_heap::low_memory_p()
+{
+       return (tenured->free_space() <= nursery->size + aging->size);
+}
+
 void data_heap::mark_all_cards()
 {
        memset(cards,-1,cards_end - cards);
index ce156696b8a3d0109f5057b5ad63ea5e32009550..cef43ef5fe9a03d5863e78ce6240759f2e4460aa 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 high_fragmentation_p();
        bool low_memory_p();
        void mark_all_cards();
 };
index 14c7f093327fca7708a6f994407d7d0785cbdfce..da7da4a95125f048f5a1d045e5b8784fb3134c14 100644 (file)
@@ -143,12 +143,20 @@ void factor_vm::collect_full(bool trace_contexts_p)
 {
        collect_mark_impl(trace_contexts_p);
        collect_sweep_impl();
+
        if(data->low_memory_p())
+       {
+               current_gc->op = collect_growing_heap_op;
+               current_gc->event->op = collect_growing_heap_op;
+               collect_growing_heap(0,trace_contexts_p);
+       }
+       else if(data->high_fragmentation_p())
        {
                current_gc->op = collect_compact_op;
                current_gc->event->op = collect_compact_op;
                collect_compact_impl(trace_contexts_p);
        }
+
        code->flush_icache();
 }
 
index f90ad58f231408427908524b5885413c37aee21d..f8a9fd45b8d0c7553ff0ba031c50a0538964af54 100755 (executable)
--- a/vm/gc.cpp
+++ b/vm/gc.cpp
@@ -152,7 +152,7 @@ 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())
+               if(data->high_fragmentation_p())
                {
                        current_gc->op = collect_full_op;
                        current_gc->event->op = collect_full_op;
@@ -161,7 +161,7 @@ void factor_vm::gc(gc_op op, cell requested_bytes, bool trace_contexts_p)
                break;
        case collect_to_tenured_op:
                collect_to_tenured();
-               if(data->low_memory_p())
+               if(data->high_fragmentation_p())
                {
                        current_gc->op = collect_full_op;
                        current_gc->event->op = collect_full_op;