moved data_heap fns to vm struct

db4
Phil Dawes 2009-08-17 21:37:05 +01:00
parent 1a87f3bb5f
commit 9f6f7adaba
2 changed files with 177 additions and 32 deletions

182
vm/data_heap.cpp Normal file → Executable file
View File

@ -16,7 +16,7 @@ bool gc_off;
data_heap *data; data_heap *data;
cell init_zone(zone *z, cell size, cell start) cell factorvm::init_zone(zone *z, cell size, cell start)
{ {
z->size = size; z->size = size;
z->start = z->here = start; z->start = z->here = start;
@ -24,7 +24,12 @@ cell init_zone(zone *z, cell size, cell start)
return z->end; return z->end;
} }
void init_card_decks() cell init_zone(zone *z, cell size, cell start)
{
return vm->init_zone(z,size,start);
}
void factorvm::init_card_decks()
{ {
cell start = align(data->seg->start,deck_size); cell start = align(data->seg->start,deck_size);
allot_markers_offset = (cell)data->allot_markers - (start >> card_bits); allot_markers_offset = (cell)data->allot_markers - (start >> card_bits);
@ -32,10 +37,12 @@ void init_card_decks()
decks_offset = (cell)data->decks - (start >> deck_bits); decks_offset = (cell)data->decks - (start >> deck_bits);
} }
data_heap *alloc_data_heap(cell gens, void init_card_decks()
cell young_size, {
cell aging_size, return vm->init_card_decks();
cell tenured_size) }
data_heap *factorvm::alloc_data_heap(cell gens, cell young_size,cell aging_size,cell tenured_size)
{ {
young_size = align(young_size,deck_size); young_size = align(young_size,deck_size);
aging_size = align(aging_size,deck_size); aging_size = align(aging_size,deck_size);
@ -99,7 +106,12 @@ data_heap *alloc_data_heap(cell gens,
return data; return data;
} }
data_heap *grow_data_heap(data_heap *data, cell requested_bytes) data_heap *alloc_data_heap(cell gens, cell young_size,cell aging_size,cell tenured_size)
{
return vm->alloc_data_heap(gens,young_size,aging_size,tenured_size);
}
data_heap *factorvm::grow_data_heap(data_heap *data, cell requested_bytes)
{ {
cell new_tenured_size = (data->tenured_size * 2) + requested_bytes; cell new_tenured_size = (data->tenured_size * 2) + requested_bytes;
@ -109,7 +121,12 @@ data_heap *grow_data_heap(data_heap *data, cell requested_bytes)
new_tenured_size); new_tenured_size);
} }
void dealloc_data_heap(data_heap *data) data_heap *grow_data_heap(data_heap *data, cell requested_bytes)
{
return vm->grow_data_heap(data,requested_bytes);
}
void factorvm::dealloc_data_heap(data_heap *data)
{ {
dealloc_segment(data->seg); dealloc_segment(data->seg);
free(data->generations); free(data->generations);
@ -120,7 +137,12 @@ void dealloc_data_heap(data_heap *data)
free(data); free(data);
} }
void clear_cards(cell from, cell to) void dealloc_data_heap(data_heap *data)
{
return vm->dealloc_data_heap(data);
}
void factorvm::clear_cards(cell from, cell to)
{ {
/* NOTE: reverse order due to heap layout. */ /* NOTE: reverse order due to heap layout. */
card *first_card = addr_to_card(data->generations[to].start); card *first_card = addr_to_card(data->generations[to].start);
@ -128,7 +150,12 @@ void clear_cards(cell from, cell to)
memset(first_card,0,last_card - first_card); memset(first_card,0,last_card - first_card);
} }
void clear_decks(cell from, cell to) void clear_cards(cell from, cell to)
{
return vm->clear_cards(from,to);
}
void factorvm::clear_decks(cell from, cell to)
{ {
/* NOTE: reverse order due to heap layout. */ /* NOTE: reverse order due to heap layout. */
card_deck *first_deck = addr_to_deck(data->generations[to].start); card_deck *first_deck = addr_to_deck(data->generations[to].start);
@ -136,7 +163,12 @@ void clear_decks(cell from, cell to)
memset(first_deck,0,last_deck - first_deck); memset(first_deck,0,last_deck - first_deck);
} }
void clear_allot_markers(cell from, cell to) void clear_decks(cell from, cell to)
{
return vm->clear_decks(from,to);
}
void factorvm::clear_allot_markers(cell from, cell to)
{ {
/* NOTE: reverse order due to heap layout. */ /* NOTE: reverse order due to heap layout. */
card *first_card = addr_to_allot_marker((object *)data->generations[to].start); card *first_card = addr_to_allot_marker((object *)data->generations[to].start);
@ -144,7 +176,12 @@ void clear_allot_markers(cell from, cell to)
memset(first_card,invalid_allot_marker,last_card - first_card); memset(first_card,invalid_allot_marker,last_card - first_card);
} }
void reset_generation(cell i) void clear_allot_markers(cell from, cell to)
{
return vm->clear_allot_markers(from,to);
}
void factorvm::reset_generation(cell i)
{ {
zone *z = (i == data->nursery() ? &nursery : &data->generations[i]); zone *z = (i == data->nursery() ? &nursery : &data->generations[i]);
@ -153,9 +190,14 @@ void reset_generation(cell i)
memset((void*)z->start,69,z->size); memset((void*)z->start,69,z->size);
} }
void reset_generation(cell i)
{
return vm->reset_generation(i);
}
/* After garbage collection, any generations which are now empty need to have /* After garbage collection, any generations which are now empty need to have
their allocation pointers and cards reset. */ their allocation pointers and cards reset. */
void reset_generations(cell from, cell to) void factorvm::reset_generations(cell from, cell to)
{ {
cell i; cell i;
for(i = from; i <= to; i++) for(i = from; i <= to; i++)
@ -166,7 +208,12 @@ void reset_generations(cell from, cell to)
clear_allot_markers(from,to); clear_allot_markers(from,to);
} }
void set_data_heap(data_heap *data_) void reset_generations(cell from, cell to)
{
return vm->reset_generations(from,to);
}
void factorvm::set_data_heap(data_heap *data_)
{ {
data = data_; data = data_;
nursery = data->generations[data->nursery()]; nursery = data->generations[data->nursery()];
@ -176,17 +223,23 @@ void set_data_heap(data_heap *data_)
clear_allot_markers(data->nursery(),data->tenured()); clear_allot_markers(data->nursery(),data->tenured());
} }
void init_data_heap(cell gens, void set_data_heap(data_heap *data_)
cell young_size, {
cell aging_size, return vm->set_data_heap(data_);
cell tenured_size, }
bool secure_gc_)
void factorvm::init_data_heap(cell gens,cell young_size,cell aging_size,cell tenured_size,bool secure_gc_)
{ {
set_data_heap(alloc_data_heap(gens,young_size,aging_size,tenured_size)); set_data_heap(alloc_data_heap(gens,young_size,aging_size,tenured_size));
secure_gc = secure_gc_; secure_gc = secure_gc_;
init_data_gc(); init_data_gc();
} }
void init_data_heap(cell gens,cell young_size,cell aging_size,cell tenured_size,bool secure_gc_)
{
return vm->init_data_heap(gens,young_size,aging_size,tenured_size,secure_gc_);
}
/* Size of the object pointed to by a tagged pointer */ /* Size of the object pointed to by a tagged pointer */
cell object_size(cell tagged) cell object_size(cell tagged)
{ {
@ -197,13 +250,18 @@ cell object_size(cell tagged)
} }
/* Size of the object pointed to by an untagged pointer */ /* Size of the object pointed to by an untagged pointer */
cell untagged_object_size(object *pointer) cell factorvm::untagged_object_size(object *pointer)
{ {
return align8(unaligned_object_size(pointer)); return align8(unaligned_object_size(pointer));
} }
cell untagged_object_size(object *pointer)
{
return vm->untagged_object_size(pointer);
}
/* Size of the data area of an object pointed to by an untagged pointer */ /* Size of the data area of an object pointed to by an untagged pointer */
cell unaligned_object_size(object *pointer) cell factorvm::unaligned_object_size(object *pointer)
{ {
switch(pointer->h.hi_tag()) switch(pointer->h.hi_tag())
{ {
@ -237,15 +295,25 @@ cell unaligned_object_size(object *pointer)
} }
} }
PRIMITIVE(size) cell unaligned_object_size(object *pointer)
{
return vm->unaligned_object_size(pointer);
}
inline void factorvm::vmprim_size()
{ {
box_unsigned_cell(object_size(dpop())); box_unsigned_cell(object_size(dpop()));
} }
PRIMITIVE(size)
{
PRIMITIVE_GETVM()->vmprim_size();
}
/* The number of cells from the start of the object which should be scanned by /* The number of cells from the start of the object which should be scanned by
the GC. Some types have a binary payload at the end (string, word, DLL) which the GC. Some types have a binary payload at the end (string, word, DLL) which
we ignore. */ we ignore. */
cell binary_payload_start(object *pointer) cell factorvm::binary_payload_start(object *pointer)
{ {
switch(pointer->h.hi_tag()) switch(pointer->h.hi_tag())
{ {
@ -279,8 +347,13 @@ cell binary_payload_start(object *pointer)
} }
} }
cell binary_payload_start(object *pointer)
{
return vm->binary_payload_start(pointer);
}
/* Push memory usage statistics in data heap */ /* Push memory usage statistics in data heap */
PRIMITIVE(data_room) inline void factorvm::vmprim_data_room()
{ {
dpush(tag_fixnum((data->cards_end - data->cards) >> 10)); dpush(tag_fixnum((data->cards_end - data->cards) >> 10));
dpush(tag_fixnum((data->decks_end - data->decks) >> 10)); dpush(tag_fixnum((data->decks_end - data->decks) >> 10));
@ -299,28 +372,48 @@ PRIMITIVE(data_room)
dpush(a.elements.value()); dpush(a.elements.value());
} }
PRIMITIVE(data_room)
{
PRIMITIVE_GETVM()->vmprim_data_room();
}
/* A heap walk allows useful things to be done, like finding all /* A heap walk allows useful things to be done, like finding all
references to an object for debugging purposes. */ references to an object for debugging purposes. */
cell heap_scan_ptr; cell heap_scan_ptr;
/* Disables GC and activates next-object ( -- obj ) primitive */ /* Disables GC and activates next-object ( -- obj ) primitive */
void begin_scan() void factorvm::begin_scan()
{ {
heap_scan_ptr = data->generations[data->tenured()].start; heap_scan_ptr = data->generations[data->tenured()].start;
gc_off = true; gc_off = true;
} }
void end_scan() void begin_scan()
{
return vm->begin_scan();
}
void factorvm::end_scan()
{ {
gc_off = false; gc_off = false;
} }
PRIMITIVE(begin_scan) void end_scan()
{
return vm->end_scan();
}
inline void factorvm::vmprim_begin_scan()
{ {
begin_scan(); begin_scan();
} }
cell next_object() PRIMITIVE(begin_scan)
{
PRIMITIVE_GETVM()->vmprim_begin_scan();
}
cell factorvm::next_object()
{ {
if(!gc_off) if(!gc_off)
general_error(ERROR_HEAP_SCAN,F,F,NULL); general_error(ERROR_HEAP_SCAN,F,F,NULL);
@ -333,19 +426,34 @@ cell next_object()
return tag_dynamic(obj); return tag_dynamic(obj);
} }
cell next_object()
{
return vm->next_object();
}
/* Push object at heap scan cursor and advance; pushes f when done */ /* Push object at heap scan cursor and advance; pushes f when done */
PRIMITIVE(next_object) inline void factorvm::vmprim_next_object()
{ {
dpush(next_object()); dpush(next_object());
} }
PRIMITIVE(next_object)
{
PRIMITIVE_GETVM()->vmprim_next_object();
}
/* Re-enables GC */ /* Re-enables GC */
PRIMITIVE(end_scan) inline void factorvm::vmprim_end_scan()
{ {
gc_off = false; gc_off = false;
} }
template<typename T> void each_object(T &functor) PRIMITIVE(end_scan)
{
PRIMITIVE_GETVM()->vmprim_end_scan();
}
template<typename T> void factorvm::each_object(T &functor)
{ {
begin_scan(); begin_scan();
cell obj; cell obj;
@ -354,6 +462,11 @@ template<typename T> void each_object(T &functor)
end_scan(); end_scan();
} }
template<typename T> void each_object(T &functor)
{
return vm->each_object(functor);
}
namespace namespace
{ {
@ -371,7 +484,7 @@ struct word_accumulator {
} }
cell find_all_words() cell factorvm::find_all_words()
{ {
word_counter counter; word_counter counter;
each_object(counter); each_object(counter);
@ -381,4 +494,9 @@ cell find_all_words()
return accum.words.elements.value(); return accum.words.elements.value();
} }
cell find_all_words()
{
return vm->find_all_words();
}
} }

View File

@ -115,6 +115,33 @@ struct factorvm {
int bignum_logbitp(int shift, bignum * arg); int bignum_logbitp(int shift, bignum * arg);
int bignum_unsigned_logbitp(int shift, bignum * bignum); int bignum_unsigned_logbitp(int shift, bignum * bignum);
bignum *digit_stream_to_bignum(unsigned int n_digits, unsigned int (*producer)(unsigned int), unsigned int radix, int negative_p); bignum *digit_stream_to_bignum(unsigned int n_digits, unsigned int (*producer)(unsigned int), unsigned int radix, int negative_p);
//data_heap
cell init_zone(zone *z, cell size, cell start);
void init_card_decks();
data_heap *alloc_data_heap(cell gens, cell young_size,cell aging_size,cell tenured_size);
data_heap *grow_data_heap(data_heap *data, cell requested_bytes);
void dealloc_data_heap(data_heap *data);
void clear_cards(cell from, cell to);
void clear_decks(cell from, cell to);
void clear_allot_markers(cell from, cell to);
void reset_generation(cell i);
void reset_generations(cell from, cell to);
void set_data_heap(data_heap *data_);
void init_data_heap(cell gens,cell young_size,cell aging_size,cell tenured_size,bool secure_gc_);
cell untagged_object_size(object *pointer);
cell unaligned_object_size(object *pointer);
inline void vmprim_size();
cell binary_payload_start(object *pointer);
inline void vmprim_data_room();
void begin_scan();
void end_scan();
inline void vmprim_begin_scan();
cell next_object();
inline void vmprim_next_object();
inline void vmprim_end_scan();
template<typename T> void each_object(T &functor);
cell find_all_words();
// next method here: // next method here:
}; };