]> gitweb.factorcode.org Git - factor.git/commitdiff
vm: make a new old_space type to encapsulate a few things, split up generations array...
authorSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Wed, 7 Oct 2009 19:05:09 +0000 (14:05 -0500)
committerSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Wed, 7 Oct 2009 19:05:09 +0000 (14:05 -0500)
14 files changed:
Makefile
vm/data_gc.cpp
vm/data_gc.hpp
vm/data_heap.cpp
vm/data_heap.hpp
vm/gc/zone.hpp [deleted file]
vm/image.cpp
vm/local_roots.cpp [deleted file]
vm/master.hpp
vm/old_space.hpp [new file with mode: 0644]
vm/vm.cpp
vm/vm.hpp
vm/write_barrier.cpp [deleted file]
vm/zone.hpp [new file with mode: 0644]

index dd2e83985e5c77e5e714b439ffb3318b3093a37c..4c50787f2d15f3a4e3ca46a739d44f2b94110bb8 100755 (executable)
--- a/Makefile
+++ b/Makefile
@@ -51,7 +51,6 @@ DLL_OBJS = $(PLAF_DLL_OBJS) \
        vm/inline_cache.o \
        vm/io.o \
        vm/jit.o \
-       vm/local_roots.o \
        vm/math.o \
        vm/primitives.o \
        vm/profiler.o \
@@ -61,8 +60,7 @@ DLL_OBJS = $(PLAF_DLL_OBJS) \
        vm/tuples.o \
        vm/utilities.o \
         vm/vm.o \
-       vm/words.o \
-       vm/write_barrier.o
+       vm/words.o
 
 EXE_OBJS = $(PLAF_EXE_OBJS)
 
index b3836e4a3b451386b12502246fe6bf5a78316f4e..dfe5ef3365637e316844b86d76a23ef8bc4ecbdb 100755 (executable)
@@ -76,19 +76,20 @@ template<typename Strategy> object *factor_vm::promote_object(object *untagged,
        return newpointer;
 }
 
-template<typename Strategy> void factor_vm::trace_card(card *ptr, cell here, Strategy &strategy)
+template<typename Strategy> void factor_vm::trace_card(card *ptr, old_space *gen, Strategy &strategy)
 {
-       cell card_scan = card_to_addr(ptr) + card_offset(ptr);
+       cell card_start = card_to_addr(ptr);
+       cell card_scan = card_start + gen->card_offset(card_start);
        cell card_end = card_to_addr(ptr + 1);
 
-       if(here < card_end) card_end = here;
+       if(gen->here < card_end) card_end = gen->here;
 
        strategy.copy_reachable_objects(card_scan,&card_end);
 
        gc_stats.cards_scanned++;
 }
 
-template<typename Strategy> void factor_vm::trace_card_deck(card_deck *deck, cell here, card mask, card unmask, Strategy &strategy)
+template<typename Strategy> void factor_vm::trace_card_deck(card_deck *deck, old_space *gen, card mask, card unmask, Strategy &strategy)
 {
        card *first_card = deck_to_card(deck);
        card *last_card = deck_to_card(deck + 1);
@@ -107,7 +108,7 @@ template<typename Strategy> void factor_vm::trace_card_deck(card_deck *deck, cel
                        {
                                if(ptr[card] & mask)
                                {
-                                       trace_card(&ptr[card],here,strategy);
+                                       trace_card(&ptr[card],gen,strategy);
                                        ptr[card] &= ~unmask;
                                }
                        }
@@ -118,7 +119,7 @@ template<typename Strategy> void factor_vm::trace_card_deck(card_deck *deck, cel
 }
 
 /* Trace all objects referenced from marked cards */
-template<typename Strategy> void factor_vm::trace_cards(cell gen, zone *z, Strategy &strategy)
+template<typename Strategy> void factor_vm::trace_cards(cell gen, old_space *z, Strategy &strategy)
 {
        u64 start_time = current_micros();
 
@@ -179,7 +180,7 @@ template<typename Strategy> void factor_vm::trace_cards(cell gen, zone *z, Strat
        {
                if(*ptr & mask)
                {
-                       trace_card_deck(ptr,z->here,mask,unmask,strategy);
+                       trace_card_deck(ptr,z,mask,unmask,strategy);
                        *ptr &= ~unmask;
                }
        }
@@ -398,10 +399,10 @@ void factor_vm::update_dirty_code_blocks()
 }
 
 template<typename Strategy>
-copying_collector<Strategy>::copying_collector(factor_vm *myvm_, zone *newspace_)
-: myvm(myvm_), current_gc(myvm_->current_gc), newspace(newspace_)
+copying_collector<Strategy>::copying_collector(factor_vm *myvm_, old_space *target_)
+: myvm(myvm_), current_gc(myvm_->current_gc), target(target_)
 {
-       scan = newspace->here;
+       scan = target->here;
 }
 
 template<typename Strategy> Strategy &copying_collector<Strategy>::strategy()
@@ -411,14 +412,7 @@ template<typename Strategy> Strategy &copying_collector<Strategy>::strategy()
 
 template<typename Strategy> object *copying_collector<Strategy>::allot(cell size)
 {
-       if(newspace->here + size <= newspace->end)
-       {
-               object *obj = newspace->allot(size);
-               myvm->allot_barrier(obj);
-               return obj;
-       }
-       else
-               return NULL;
+       return target->allot(size);
 }
 
 template<typename Strategy> object *copying_collector<Strategy>::copy_object(object *untagged)
@@ -440,13 +434,13 @@ template<typename Strategy> cell copying_collector<Strategy>::trace_next(cell sc
 
 template<typename Strategy> void copying_collector<Strategy>::go()
 {
-       strategy().copy_reachable_objects(scan,&newspace->here);
+       strategy().copy_reachable_objects(scan,&target->here);
 }
 
 struct nursery_collector : copying_collector<nursery_collector>
 {
-       explicit nursery_collector(factor_vm *myvm_, zone *newspace_) :
-               copying_collector<nursery_collector>(myvm_,newspace_) {}
+       explicit nursery_collector(factor_vm *myvm_, old_space *target_) :
+               copying_collector<nursery_collector>(myvm_,target_) {}
 
        bool should_copy_p(object *untagged)
        {
@@ -463,13 +457,13 @@ struct aging_collector : copying_collector<aging_collector>
 {
        zone *tenured;
 
-       explicit aging_collector(factor_vm *myvm_, zone *newspace_) :
-               copying_collector<aging_collector>(myvm_,newspace_),
+       explicit aging_collector(factor_vm *myvm_, old_space *target_) :
+               copying_collector<aging_collector>(myvm_,target_),
                tenured(myvm->data->tenured) {}
 
        bool should_copy_p(object *untagged)
        {
-               if(newspace->contains_p(untagged))
+               if(target->contains_p(untagged))
                        return false;
                else
                        return !tenured->contains_p(untagged);
@@ -483,12 +477,12 @@ struct aging_collector : copying_collector<aging_collector>
 
 struct aging_again_collector : copying_collector<aging_again_collector>
 {
-       explicit aging_again_collector(factor_vm *myvm_, zone *newspace_) :
-               copying_collector<aging_again_collector>(myvm_,newspace_) {}
+       explicit aging_again_collector(factor_vm *myvm_, old_space *target_) :
+               copying_collector<aging_again_collector>(myvm_,target_) {}
 
        bool should_copy_p(object *untagged)
        {
-               return !newspace->contains_p(untagged);
+               return !target->contains_p(untagged);
        }
        
        void copy_reachable_objects(cell scan, cell *end)
@@ -499,12 +493,12 @@ struct aging_again_collector : copying_collector<aging_again_collector>
 
 struct tenured_collector : copying_collector<tenured_collector>
 {
-       explicit tenured_collector(factor_vm *myvm_, zone *newspace_) :
-               copying_collector<tenured_collector>(myvm_,newspace_) {}
+       explicit tenured_collector(factor_vm *myvm_, old_space *target_) :
+               copying_collector<tenured_collector>(myvm_,target_) {}
        
        bool should_copy_p(object *untagged)
        {
-               return !newspace->contains_p(untagged);
+               return !target->contains_p(untagged);
        }
        
        void copy_reachable_objects(cell scan, cell *end)
@@ -791,7 +785,6 @@ object *factor_vm::allot_object(header header, cell size)
                        garbage_collection(tenured_gen,true,true,size);
 
                obj = data->tenured->allot(size);
-               allot_barrier(obj);
 
                /* Allows initialization code to store old->new pointers
                without hitting the write barrier in the common case of
index 68aab2f6b3130538ea292a0ca59c8f4fb5b7f969..9032f6696dfbdc9b7cb168e9575d75781adb41cf 100755 (executable)
@@ -66,10 +66,10 @@ struct gc_state {
 template<typename Strategy> struct copying_collector {
        factor_vm *myvm;
        gc_state *current_gc;
-       zone *newspace;
+       old_space *target;
        cell scan;
 
-       explicit copying_collector(factor_vm *myvm_, zone *newspace);
+       explicit copying_collector(factor_vm *myvm_, old_space *target);
        Strategy &strategy();
        object *allot(cell size);
        cell trace_next(cell scan);
index 4fc9770c559d239a1b836806af6c56c266775e39..7e358cb2f90c70e79016a2818a456d7551d77093 100755 (executable)
@@ -6,7 +6,6 @@ namespace factor
 void factor_vm::init_card_decks()
 {
        cell start = align(data->seg->start,deck_size);
-       allot_markers_offset = (cell)data->allot_markers - (start >> card_bits);
        cards_offset = (cell)data->cards - (start >> card_bits);
        decks_offset = (cell)data->decks - (start >> deck_bits);
 }
@@ -36,26 +35,17 @@ data_heap::data_heap(factor_vm *myvm, cell young_size_, cell aging_size_, cell t
        decks = new char[decks_size];
        decks_end = decks + decks_size;
 
-       allot_markers = new char[cards_size];
-       allot_markers_end = allot_markers + cards_size;
+       cell start = align(seg->start,deck_size);
 
-       cell alloter = align(seg->start,deck_size);
+       tenured = new old_space(tenured_size,start);
+       tenured_semispace = new old_space(tenured_size,tenured->end);
 
-       tenured = new zone;
-       tenured_semispace = new zone;
-       alloter = tenured->init_zone(tenured_size,alloter);
-       alloter = tenured_semispace->init_zone(tenured_size,alloter);
+       aging = new old_space(aging_size,tenured_semispace->end);
+       aging_semispace = new old_space(aging_size,aging->end);
 
-       aging = new zone;
-       aging_semispace = new zone;
-       alloter = aging->init_zone(aging_size,alloter);
-       alloter = aging_semispace->init_zone(aging_size,alloter);
+       nursery = new zone(young_size,aging_semispace->end);
 
-       nursery = new zone;
-       alloter = nursery->init_zone(young_size,alloter);
-
-       if(seg->end - alloter > deck_size)
-               critical_error("Bug in alloc_data_heap",alloter);
+       assert(seg->end - nursery->end <= deck_size);
 }
 
 data_heap::~data_heap()
@@ -66,7 +56,6 @@ data_heap::~data_heap()
        delete aging_semispace;
        delete tenured;
        delete tenured_semispace;
-       delete[] allot_markers;
        delete[] cards;
        delete[] decks;
 }
@@ -81,7 +70,7 @@ data_heap *factor_vm::grow_data_heap(data_heap *data, cell requested_bytes)
                new_tenured_size);
 }
 
-void factor_vm::clear_cards(zone *gen)
+void factor_vm::clear_cards(old_space *gen)
 {
        /* NOTE: reverse order due to heap layout. */
        card *first_card = addr_to_card(gen->start);
@@ -89,7 +78,7 @@ void factor_vm::clear_cards(zone *gen)
        memset(first_card,0,last_card - first_card);
 }
 
-void factor_vm::clear_decks(zone *gen)
+void factor_vm::clear_decks(old_space *gen)
 {
        /* NOTE: reverse order due to heap layout. */
        card_deck *first_deck = addr_to_deck(gen->start);
@@ -97,23 +86,16 @@ void factor_vm::clear_decks(zone *gen)
        memset(first_deck,0,last_deck - first_deck);
 }
 
-void factor_vm::clear_allot_markers(zone *gen)
-{
-       card *first_card = addr_to_allot_marker((object *)gen->start);
-       card *last_card = addr_to_allot_marker((object *)gen->end);
-       memset(first_card,invalid_allot_marker,last_card - first_card);
-}
-
 /* After garbage collection, any generations which are now empty need to have
 their allocation pointers and cards reset. */
-void factor_vm::reset_generation(zone *gen)
+void factor_vm::reset_generation(old_space *gen)
 {
        gen->here = gen->start;
        if(secure_gc) memset((void*)gen->start,69,gen->size);
 
        clear_cards(gen);
        clear_decks(gen);
-       clear_allot_markers(gen);
+       gen->clear_allot_markers();
 }
 
 void factor_vm::set_data_heap(data_heap *data_)
index 891d1361edee43e0797e489e8b31950486e03820..3f620e3d4242477a28d81df6e71533755785c868 100755 (executable)
@@ -9,13 +9,10 @@ struct data_heap {
        segment *seg;
 
        zone *nursery;
-       zone *aging;
-       zone *aging_semispace;
-       zone *tenured;
-       zone *tenured_semispace;
-
-       char *allot_markers;
-       char *allot_markers_end;
+       old_space *aging;
+       old_space *aging_semispace;
+       old_space *tenured;
+       old_space *tenured_semispace;
 
        char *cards;
        char *cards_end;
diff --git a/vm/gc/zone.hpp b/vm/gc/zone.hpp
deleted file mode 100644 (file)
index a05afd4..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-namespace factor
-{
-
-struct zone {
-       /* allocation pointer is 'here'; its offset is hardcoded in the
-       compiler backends */
-       cell start;
-       cell here;
-       cell size;
-       cell end;
-
-       cell init_zone(cell size_, cell start_)
-       {
-               size = size_;
-               start = here = start_;
-               end = start_ + size_;
-               return end;
-       }
-
-       inline bool contains_p(object *pointer)
-       {
-               return ((cell)pointer - start) < size;
-       }
-
-       inline object *allot(cell size)
-       {
-               cell h = here;
-               here = h + align8(size);
-               return (object *)h;
-       }
-};
-
-}
index 9a7093750836731a4deb624ac51ebc36f9bf7e38..272309063b057fe1a9cf77f612d6fdb4abdc1043 100755 (executable)
@@ -280,7 +280,7 @@ void factor_vm::relocate_data()
                relocating += untagged_object_size((object *)relocating))
        {
                object *obj = (object *)relocating;
-               allot_barrier(obj);
+               data->tenured->record_allocation(obj);
                relocate_object(obj);
        }
 }
diff --git a/vm/local_roots.cpp b/vm/local_roots.cpp
deleted file mode 100644 (file)
index 71baee6..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-#include "master.hpp"
-
-namespace factor
-{
-}
index d942c1a3ac7c69252d13e9b677d29d5d2f87a37a..97e9ed4a8b2ad57f8dfe71f6563aa54afc5a6629 100755 (executable)
@@ -69,9 +69,10 @@ namespace factor
 #include "bignumint.hpp"
 #include "bignum.hpp"
 #include "code_block.hpp"
-#include "gc/zone.hpp"
-#include "data_heap.hpp"
+#include "zone.hpp"
 #include "write_barrier.hpp"
+#include "old_space.hpp"
+#include "data_heap.hpp"
 #include "data_gc.hpp"
 #include "debug.hpp"
 #include "strings.hpp"
diff --git a/vm/old_space.hpp b/vm/old_space.hpp
new file mode 100644 (file)
index 0000000..598c1f4
--- /dev/null
@@ -0,0 +1,62 @@
+namespace factor
+{
+
+struct old_space : zone {
+       card *allot_markers;
+       card *allot_markers_end;
+
+       old_space(cell size_, cell start_) : zone(size_,start_)
+       {
+               cell cards_size = size_ >> card_bits;
+               allot_markers = new card[cards_size];
+               allot_markers_end = allot_markers + cards_size;
+       }
+
+       ~old_space()
+       {
+               delete[] allot_markers;
+       }
+
+       card *addr_to_allot_marker(object *a)
+       {
+               return (card *)((((cell)a - start) >> card_bits) + (cell)allot_markers);
+       }
+
+       /* we need to remember the first object allocated in the card */
+       void record_allocation(object *obj)
+       {
+               card *ptr = addr_to_allot_marker(obj);
+               if(*ptr == invalid_allot_marker)
+                       *ptr = ((cell)obj & addr_card_mask);
+       }
+
+       cell card_offset(cell address)
+       {
+               return allot_markers[(address - start) >> card_bits];
+       }
+
+       object *allot(cell size)
+       {
+               if(here + size > end) return NULL;
+
+               object *obj = zone::allot(size);
+               record_allocation(obj);
+               return obj;
+       }
+
+       void clear_allot_markers()
+       {
+               memset(allot_markers,invalid_allot_marker,size >> card_bits);
+       }
+
+       /* object *next_object_after(object *ptr)
+       {
+               cell size = untagged_object_size(ptr);
+               if((cell)ptr + size < end)
+                       return (object *)((cell)ptr + size);
+               else
+                       return NULL;
+       } */
+};
+
+}
index 15df6cc18a656413c559bec666640c7a5e130a54..50dc441086e6543e566d9fa8f36357755f479925 100755 (executable)
--- a/vm/vm.cpp
+++ b/vm/vm.cpp
@@ -4,6 +4,7 @@ namespace factor
 {\r
 \r
 factor_vm::factor_vm() :\r
+       nursery(0,0),\r
        profiling_p(false),\r
        secure_gc(false),\r
        gc_off(false),\r
index 9836342fe22849f56da252f59ec2debdc73ded7c..02ab128969297a82e782d390b71fb9f6d7ca8a11 100755 (executable)
--- a/vm/vm.hpp
+++ b/vm/vm.hpp
@@ -53,9 +53,6 @@ struct factor_vm
        /* Code heap */
        code_heap *code;
 
-       /* Where we store object start offsets in cards */
-       cell allot_markers_offset;
-
        /* Only set if we're performing a GC */
        gc_state *current_gc;
 
@@ -211,10 +208,9 @@ struct factor_vm
        //data_heap
        void init_card_decks();
        data_heap *grow_data_heap(data_heap *data, cell requested_bytes);
-       void clear_cards(zone *gen);
-       void clear_decks(zone *gen);
-       void clear_allot_markers(zone *gen);
-       void reset_generation(zone *gen);
+       void clear_cards(old_space *gen);
+       void clear_decks(old_space *gen);
+       void reset_generation(old_space *gen);
        void set_data_heap(data_heap *data_);
        void init_data_heap(cell young_size, cell aging_size, cell tenured_size, bool secure_gc_);
        cell untagged_object_size(object *pointer);
@@ -243,11 +239,6 @@ struct factor_vm
                return ((cell)c - cards_offset) << card_bits;
        }
 
-       inline cell card_offset(card *c)
-       {
-               return *(c - (cell)data->cards + (cell)data->allot_markers);
-       }
-
        inline card_deck *addr_to_deck(cell a)
        {
                return (card_deck *)(((cell)a >> deck_bits) + decks_offset);
@@ -263,11 +254,6 @@ struct factor_vm
                return (card *)((((cell)d - decks_offset) << (deck_bits - card_bits)) + cards_offset);
        }
 
-       inline card *addr_to_allot_marker(object *a)
-       {
-               return (card *)(((cell)a >> card_bits) + allot_markers_offset);
-       }
-
        /* the write barrier must be called any time we are potentially storing a
           pointer from an older generation to a younger one */
        inline void write_barrier(object *obj)
@@ -276,22 +262,14 @@ struct factor_vm
                *addr_to_deck((cell)obj) = card_mark_mask;
        }
 
-       /* we need to remember the first object allocated in the card */
-       inline void allot_barrier(object *address)
-       {
-               card *ptr = addr_to_allot_marker(address);
-               if(*ptr == invalid_allot_marker)
-                       *ptr = ((cell)address & addr_card_mask);
-       }
-
        // data_gc
        template<typename Strategy> object *resolve_forwarding(object *untagged, Strategy &strategy);
        template<typename Strategy> void trace_handle(cell *handle, Strategy &strategy);
        template<typename Strategy> object *promote_object(object *pointer, Strategy &strategy);
        template<typename Strategy> void trace_slots(object *ptr, Strategy &strategy);
-       template<typename Strategy> void trace_card(card *ptr, cell here, Strategy &strategy);
-       template<typename Strategy> void trace_card_deck(card_deck *deck, cell here, card mask, card unmask, Strategy &strategy);
-       template<typename Strategy> void trace_cards(cell gen, zone *z, Strategy &strategy);
+       template<typename Strategy> void trace_card(card *ptr, old_space *gen, Strategy &strategy);
+       template<typename Strategy> void trace_card_deck(card_deck *deck, old_space *gen, card mask, card unmask, Strategy &strategy);
+       template<typename Strategy> void trace_cards(cell gen, old_space *z, Strategy &strategy);
        template<typename Strategy> void trace_stack_elements(segment *region, cell top, Strategy &strategy);
        template<typename Strategy> void trace_registered_locals(Strategy &strategy);
        template<typename Strategy> void trace_registered_bignums(Strategy &strategy);
diff --git a/vm/write_barrier.cpp b/vm/write_barrier.cpp
deleted file mode 100644 (file)
index 774f744..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-#include "master.hpp"
-
-using namespace factor;
-
diff --git a/vm/zone.hpp b/vm/zone.hpp
new file mode 100644 (file)
index 0000000..a05afd4
--- /dev/null
@@ -0,0 +1,33 @@
+namespace factor
+{
+
+struct zone {
+       /* allocation pointer is 'here'; its offset is hardcoded in the
+       compiler backends */
+       cell start;
+       cell here;
+       cell size;
+       cell end;
+
+       cell init_zone(cell size_, cell start_)
+       {
+               size = size_;
+               start = here = start_;
+               end = start_ + size_;
+               return end;
+       }
+
+       inline bool contains_p(object *pointer)
+       {
+               return ((cell)pointer - start) < size;
+       }
+
+       inline object *allot(cell size)
+       {
+               cell h = here;
+               here = h + align8(size);
+               return (object *)h;
+       }
+};
+
+}