vm: cleanup

db4
Slava Pestov 2009-10-06 01:42:17 -05:00
parent e2fcec6a99
commit d10e27149c
10 changed files with 46 additions and 45 deletions

View File

@ -466,7 +466,7 @@ code_block *factor_vm::add_code_block(cell type, cell code_, cell labels_, cell
/* next time we do a minor GC, we have to scan the code heap for /* next time we do a minor GC, we have to scan the code heap for
literals */ literals */
last_code_heap_scan = data->nursery(); this->code->last_code_heap_scan = data->nursery();
return compiled; return compiled;
} }

View File

@ -3,10 +3,12 @@
namespace factor namespace factor
{ {
code_heap::code_heap(factor_vm *myvm, cell size) : heap(myvm,size) {}
/* Allocate a code heap during startup */ /* Allocate a code heap during startup */
void factor_vm::init_code_heap(cell size) void factor_vm::init_code_heap(cell size)
{ {
code = new heap(this,size); code = new code_heap(this,size);
} }
bool factor_vm::in_code_heap_p(cell ptr) bool factor_vm::in_code_heap_p(cell ptr)
@ -28,6 +30,16 @@ void factor_vm::jit_compile_word(cell word_, cell def_, bool relocate)
if(word->pic_tail_def != F) jit_compile(word->pic_tail_def,relocate); if(word->pic_tail_def != F) jit_compile(word->pic_tail_def,relocate);
} }
struct word_updater {
factor_vm *myvm;
explicit word_updater(factor_vm *myvm_) : myvm(myvm_) {}
void operator()(code_block *compiled)
{
myvm->update_word_references(compiled);
}
};
/* Update pointers to words referenced from all code blocks. Only after /* Update pointers to words referenced from all code blocks. Only after
defining a new word. */ defining a new word. */
void factor_vm::update_code_heap_words() void factor_vm::update_code_heap_words()
@ -100,7 +112,7 @@ void factor_vm::primitive_code_room()
code_block *factor_vm::forward_xt(code_block *compiled) code_block *factor_vm::forward_xt(code_block *compiled)
{ {
return (code_block *)forwarding[compiled]; return (code_block *)code->forwarding[compiled];
} }
struct xt_forwarder { struct xt_forwarder {
@ -199,13 +211,13 @@ void factor_vm::compact_code_heap()
garbage_collection(data->tenured(),false,false,0); garbage_collection(data->tenured(),false,false,0);
/* Figure out where the code heap blocks are going to end up */ /* Figure out where the code heap blocks are going to end up */
cell size = code->compute_heap_forwarding(forwarding); cell size = code->compute_heap_forwarding();
/* Update word and quotation code pointers */ /* Update word and quotation code pointers */
forward_object_xts(); forward_object_xts();
/* Actually perform the compaction */ /* Actually perform the compaction */
code->compact_heap(forwarding); code->compact_heap();
/* Update word and quotation XTs */ /* Update word and quotation XTs */
fixup_object_xts(); fixup_object_xts();

View File

@ -1,21 +1,14 @@
namespace factor namespace factor
{ {
inline void factor_vm::check_code_pointer(cell ptr) struct code_heap : heap {
{ /* What generation was being collected when trace_code_heap_roots() was last
#ifdef FACTOR_DEBUG called? Until the next call to add_code_block(), future
assert(in_code_heap_p(ptr)); collections of younger generations don't have to touch the code
#endif heap. */
} cell last_code_heap_scan;
struct word_updater { explicit code_heap(factor_vm *myvm, cell size);
factor_vm *myvm;
explicit word_updater(factor_vm *myvm_) : myvm(myvm_) {}
void operator()(code_block *compiled)
{
myvm->update_word_references(compiled);
}
}; };
} }

View File

@ -5,7 +5,7 @@ namespace factor
void factor_vm::init_data_gc() void factor_vm::init_data_gc()
{ {
last_code_heap_scan = data->nursery(); code->last_code_heap_scan = data->nursery();
} }
gc_state::gc_state(data_heap *data_, bool growing_data_heap_, cell collecting_gen_) : gc_state::gc_state(data_heap *data_, bool growing_data_heap_, cell collecting_gen_) :
@ -321,15 +321,15 @@ template<typename Strategy> struct literal_reference_tracer {
aging and nursery collections */ aging and nursery collections */
template<typename Strategy> void factor_vm::trace_code_heap_roots(Strategy &strategy) template<typename Strategy> void factor_vm::trace_code_heap_roots(Strategy &strategy)
{ {
if(current_gc->collecting_gen >= last_code_heap_scan) if(current_gc->collecting_gen >= code->last_code_heap_scan)
{ {
literal_reference_tracer<Strategy> tracer(this,strategy); literal_reference_tracer<Strategy> tracer(this,strategy);
iterate_code_heap(tracer); iterate_code_heap(tracer);
if(current_gc->collecting_accumulation_gen_p()) if(current_gc->collecting_accumulation_gen_p())
last_code_heap_scan = current_gc->collecting_gen; code->last_code_heap_scan = current_gc->collecting_gen;
else else
last_code_heap_scan = current_gc->collecting_gen + 1; code->last_code_heap_scan = current_gc->collecting_gen + 1;
code_heap_scans++; code_heap_scans++;
} }
@ -364,7 +364,7 @@ void factor_vm::free_unmarked_code_blocks()
{ {
literal_and_word_reference_updater updater(this); literal_and_word_reference_updater updater(this);
code->free_unmarked(updater); code->free_unmarked(updater);
last_code_heap_scan = current_gc->collecting_gen; code->last_code_heap_scan = current_gc->collecting_gen;
} }
void factor_vm::update_dirty_code_blocks() void factor_vm::update_dirty_code_blocks()

View File

@ -96,7 +96,6 @@ void heap::assert_free_block(free_heap_block *block)
myvm->critical_error("Invalid block in free list",(cell)block); myvm->critical_error("Invalid block in free list",(cell)block);
} }
free_heap_block *heap::find_free_block(cell size) free_heap_block *heap::find_free_block(cell size)
{ {
cell attempt = size; cell attempt = size;
@ -254,7 +253,7 @@ cell heap::heap_size()
} }
/* Compute where each block is going to go, after compaction */ /* Compute where each block is going to go, after compaction */
cell heap::compute_heap_forwarding(unordered_map<heap_block *,char *> &forwarding) cell heap::compute_heap_forwarding()
{ {
heap_block *scan = first_block(); heap_block *scan = first_block();
char *address = (char *)first_block(); char *address = (char *)first_block();
@ -275,7 +274,7 @@ cell heap::compute_heap_forwarding(unordered_map<heap_block *,char *> &forwardin
return (cell)address - seg->start; return (cell)address - seg->start;
} }
void heap::compact_heap(unordered_map<heap_block *,char *> &forwarding) void heap::compact_heap()
{ {
heap_block *scan = first_block(); heap_block *scan = first_block();

View File

@ -13,6 +13,7 @@ struct heap {
factor_vm *myvm; factor_vm *myvm;
segment *seg; segment *seg;
heap_free_list free; heap_free_list free;
unordered_map<heap_block *, char *> forwarding;
explicit heap(factor_vm *myvm, cell size); explicit heap(factor_vm *myvm, cell size);
@ -48,8 +49,8 @@ struct heap {
void unmark_marked(); void unmark_marked();
void heap_usage(cell *used, cell *total_free, cell *max_free); void heap_usage(cell *used, cell *total_free, cell *max_free);
cell heap_size(); cell heap_size();
cell compute_heap_forwarding(unordered_map<heap_block *,char *> &forwarding); cell compute_heap_forwarding();
void compact_heap(unordered_map<heap_block *,char *> &forwarding); void compact_heap();
heap_block *free_allocated(heap_block *prev, heap_block *scan); heap_block *free_allocated(heap_block *prev, heap_block *scan);

View File

@ -76,6 +76,7 @@ namespace factor
#include "heap.hpp" #include "heap.hpp"
#include "image.hpp" #include "image.hpp"
#include "alien.hpp" #include "alien.hpp"
#include "code_heap.hpp"
#include "vm.hpp" #include "vm.hpp"
#include "tagged.hpp" #include "tagged.hpp"
#include "local_roots.hpp" #include "local_roots.hpp"
@ -84,7 +85,6 @@ namespace factor
#include "arrays.hpp" #include "arrays.hpp"
#include "math.hpp" #include "math.hpp"
#include "booleans.hpp" #include "booleans.hpp"
#include "code_heap.hpp"
#include "byte_arrays.hpp" #include "byte_arrays.hpp"
#include "jit.hpp" #include "jit.hpp"
#include "quotations.hpp" #include "quotations.hpp"

View File

@ -43,9 +43,7 @@ void factor_vm::set_profiling(bool profiling)
update_word_xt(word.value()); update_word_xt(word.value());
} }
/* Update XTs in code heap */ update_code_heap_words();
word_updater updater(this);
iterate_code_heap(updater);
} }
void factor_vm::primitive_profiling() void factor_vm::primitive_profiling()

View File

@ -343,9 +343,7 @@ void factor_vm::compile_all_words()
} }
/* Update XTs in code heap */ update_code_heap_words();
word_updater updater(this);
iterate_code_heap(updater);
} }
/* Allocates memory */ /* Allocates memory */

View File

@ -236,11 +236,6 @@ struct factor_vm
u64 decks_scanned; u64 decks_scanned;
u64 card_scan_time; u64 card_scan_time;
cell code_heap_scans; cell code_heap_scans;
/* What generation was being collected when trace_code_heap_roots() was last
called? Until the next call to add_code_block(), future
collections of younger generations don't have to touch the code
heap. */
cell last_code_heap_scan;
void init_data_gc(); void init_data_gc();
template<typename Strategy> void trace_handle(cell *handle, Strategy &strategy); template<typename Strategy> void trace_handle(cell *handle, Strategy &strategy);
@ -526,8 +521,14 @@ struct factor_vm
} }
//code_heap //code_heap
heap *code; code_heap *code;
unordered_map<heap_block *, char *> forwarding;
inline void check_code_pointer(cell ptr)
{
#ifdef FACTOR_DEBUG
assert(in_code_heap_p(ptr));
#endif
}
void init_code_heap(cell size); void init_code_heap(cell size);
bool in_code_heap_p(cell ptr); bool in_code_heap_p(cell ptr);
@ -539,7 +540,6 @@ struct factor_vm
void forward_object_xts(); void forward_object_xts();
void fixup_object_xts(); void fixup_object_xts();
void compact_code_heap(); void compact_code_heap();
inline void check_code_pointer(cell ptr);
/* Apply a function to every code block */ /* Apply a function to every code block */
template<typename Iterator> void iterate_code_heap(Iterator &iter) template<typename Iterator> void iterate_code_heap(Iterator &iter)