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
literals */
last_code_heap_scan = data->nursery();
this->code->last_code_heap_scan = data->nursery();
return compiled;
}

View File

@ -3,10 +3,12 @@
namespace factor
{
code_heap::code_heap(factor_vm *myvm, cell size) : heap(myvm,size) {}
/* Allocate a code heap during startup */
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)
@ -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);
}
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
defining a new word. */
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)
{
return (code_block *)forwarding[compiled];
return (code_block *)code->forwarding[compiled];
}
struct xt_forwarder {
@ -199,13 +211,13 @@ void factor_vm::compact_code_heap()
garbage_collection(data->tenured(),false,false,0);
/* 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 */
forward_object_xts();
/* Actually perform the compaction */
code->compact_heap(forwarding);
code->compact_heap();
/* Update word and quotation XTs */
fixup_object_xts();

View File

@ -1,21 +1,14 @@
namespace factor
{
inline void factor_vm::check_code_pointer(cell ptr)
{
#ifdef FACTOR_DEBUG
assert(in_code_heap_p(ptr));
#endif
}
struct word_updater {
factor_vm *myvm;
explicit word_updater(factor_vm *myvm_) : myvm(myvm_) {}
void operator()(code_block *compiled)
{
myvm->update_word_references(compiled);
}
struct code_heap : heap {
/* 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;
explicit code_heap(factor_vm *myvm, cell size);
};
}

View File

@ -5,7 +5,7 @@ namespace factor
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_) :
@ -321,15 +321,15 @@ template<typename Strategy> struct literal_reference_tracer {
aging and nursery collections */
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);
iterate_code_heap(tracer);
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
last_code_heap_scan = current_gc->collecting_gen + 1;
code->last_code_heap_scan = current_gc->collecting_gen + 1;
code_heap_scans++;
}
@ -364,7 +364,7 @@ void factor_vm::free_unmarked_code_blocks()
{
literal_and_word_reference_updater updater(this);
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()

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);
}
free_heap_block *heap::find_free_block(cell size)
{
cell attempt = size;
@ -254,7 +253,7 @@ cell heap::heap_size()
}
/* 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();
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;
}
void heap::compact_heap(unordered_map<heap_block *,char *> &forwarding)
void heap::compact_heap()
{
heap_block *scan = first_block();

View File

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

View File

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

View File

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

View File

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

View File

@ -236,11 +236,6 @@ struct factor_vm
u64 decks_scanned;
u64 card_scan_time;
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();
template<typename Strategy> void trace_handle(cell *handle, Strategy &strategy);
@ -526,8 +521,14 @@ struct factor_vm
}
//code_heap
heap *code;
unordered_map<heap_block *, char *> forwarding;
code_heap *code;
inline void check_code_pointer(cell ptr)
{
#ifdef FACTOR_DEBUG
assert(in_code_heap_p(ptr));
#endif
}
void init_code_heap(cell size);
bool in_code_heap_p(cell ptr);
@ -539,7 +540,6 @@ struct factor_vm
void forward_object_xts();
void fixup_object_xts();
void compact_code_heap();
inline void check_code_pointer(cell ptr);
/* Apply a function to every code block */
template<typename Iterator> void iterate_code_heap(Iterator &iter)