VM: no need for a nursery_space class, it's just a bump_allocator

db4
Björn Lindqvist 2014-11-21 10:34:23 +01:00 committed by John Benediktsson
parent ad71f79be3
commit 885b5c7043
9 changed files with 16 additions and 26 deletions

View File

@ -92,7 +92,6 @@ ifdef CONFIG
vm/free_list_allocator.hpp \ vm/free_list_allocator.hpp \
vm/write_barrier.hpp \ vm/write_barrier.hpp \
vm/object_start_map.hpp \ vm/object_start_map.hpp \
vm/nursery_space.hpp \
vm/aging_space.hpp \ vm/aging_space.hpp \
vm/tenured_space.hpp \ vm/tenured_space.hpp \
vm/data_heap.hpp \ vm/data_heap.hpp \

View File

@ -1,16 +1,16 @@
namespace factor { namespace factor {
struct aging_space : bump_allocator<object> { struct aging_space : bump_allocator {
object_start_map starts; object_start_map starts;
aging_space(cell size, cell start) aging_space(cell size, cell start)
: bump_allocator<object>(size, start), starts(size, start) {} : bump_allocator(size, start), starts(size, start) {}
object* allot(cell size) { object* allot(cell size) {
if (here + size > end) if (here + size > end)
return NULL; return NULL;
object* obj = bump_allocator<object>::allot(size); object* obj = bump_allocator::allot(size);
starts.record_object_start_offset(obj); starts.record_object_start_offset(obj);
return obj; return obj;
} }

View File

@ -8,7 +8,7 @@ namespace factor {
inline object* factor_vm::allot_object(cell type, cell size) { inline object* factor_vm::allot_object(cell type, cell size) {
FACTOR_ASSERT(!current_gc); FACTOR_ASSERT(!current_gc);
nursery_space *nursery = data->nursery; bump_allocator *nursery = data->nursery;
/* If the object is smaller than the nursery, allocate it in the nursery, /* If the object is smaller than the nursery, allocate it in the nursery,
after a GC if needed */ after a GC if needed */
if (nursery->size > size) { if (nursery->size > size) {

View File

@ -1,6 +1,6 @@
namespace factor { namespace factor {
template <typename Block> struct bump_allocator { struct bump_allocator {
/* offset of 'here' and 'end' is hardcoded in compiler backends */ /* offset of 'here' and 'end' is hardcoded in compiler backends */
cell here; cell here;
cell start; cell start;
@ -10,12 +10,12 @@ template <typename Block> struct bump_allocator {
bump_allocator(cell size, cell start) bump_allocator(cell size, cell start)
: here(start), start(start), end(start + size), size(size) {} : here(start), start(start), end(start + size), size(size) {}
bool contains_p(Block* block) { return ((cell)block - start) < size; } bool contains_p(object* obj) { return ((cell)obj - start) < size; }
Block* allot(cell size) { object* allot(cell size) {
cell h = here; cell h = here;
here = h + align(size, data_alignment); here = h + align(size, data_alignment);
return (Block*)h; return (object*)h;
} }
cell occupied_space() { return here - start; } cell occupied_space() { return here - start; }

View File

@ -7,7 +7,7 @@ void factor_vm::init_card_decks() {
decks_offset = (cell)data->decks - addr_to_deck(data->start); decks_offset = (cell)data->decks - addr_to_deck(data->start);
} }
data_heap::data_heap(nursery_space* vm_nursery, data_heap::data_heap(bump_allocator* vm_nursery,
cell young_size_, cell young_size_,
cell aging_size_, cell aging_size_,
cell tenured_size_) { cell tenured_size_) {
@ -59,7 +59,7 @@ data_heap::~data_heap() {
delete[] decks; delete[] decks;
} }
data_heap* data_heap::grow(nursery_space* vm_nursery, cell requested_bytes) { data_heap* data_heap::grow(bump_allocator* vm_nursery, cell requested_bytes) {
FACTOR_ASSERT(vm_nursery->occupied_space() == 0); FACTOR_ASSERT(vm_nursery->occupied_space() == 0);
cell new_tenured_size = (tenured_size * 2) + requested_bytes; cell new_tenured_size = (tenured_size * 2) + requested_bytes;
return new data_heap(vm_nursery, young_size, aging_size, new_tenured_size); return new data_heap(vm_nursery, young_size, aging_size, new_tenured_size);
@ -77,7 +77,7 @@ template <typename Generation> void data_heap::clear_decks(Generation* gen) {
memset(&decks[first_deck], 0, last_deck - first_deck); memset(&decks[first_deck], 0, last_deck - first_deck);
} }
void data_heap::reset_generation(nursery_space* gen) { void data_heap::reset_generation(bump_allocator* gen) {
gen->flush(); gen->flush();
} }

View File

@ -10,7 +10,7 @@ struct data_heap {
segment* seg; segment* seg;
/* Borrowed reference to a factor_vm::nursery */ /* Borrowed reference to a factor_vm::nursery */
nursery_space* nursery; bump_allocator* nursery;
aging_space* aging; aging_space* aging;
aging_space* aging_semispace; aging_space* aging_semispace;
tenured_space* tenured; tenured_space* tenured;
@ -21,15 +21,15 @@ struct data_heap {
card_deck* decks; card_deck* decks;
card_deck* decks_end; card_deck* decks_end;
data_heap(nursery_space* vm_nursery, data_heap(bump_allocator* vm_nursery,
cell young_size, cell young_size,
cell aging_size, cell aging_size,
cell tenured_size); cell tenured_size);
~data_heap(); ~data_heap();
data_heap* grow(nursery_space* vm_nursery, cell requested_size); data_heap* grow(bump_allocator* vm_nursery, cell requested_size);
template <typename Generation> void clear_cards(Generation* gen); template <typename Generation> void clear_cards(Generation* gen);
template <typename Generation> void clear_decks(Generation* gen); template <typename Generation> void clear_decks(Generation* gen);
void reset_generation(nursery_space* gen); void reset_generation(bump_allocator* gen);
void reset_generation(aging_space* gen); void reset_generation(aging_space* gen);
void reset_generation(tenured_space* gen); void reset_generation(tenured_space* gen);
bool high_fragmentation_p(); bool high_fragmentation_p();

View File

@ -111,7 +111,6 @@ namespace factor { struct factor_vm; }
#include "free_list_allocator.hpp" #include "free_list_allocator.hpp"
#include "write_barrier.hpp" #include "write_barrier.hpp"
#include "object_start_map.hpp" #include "object_start_map.hpp"
#include "nursery_space.hpp"
#include "aging_space.hpp" #include "aging_space.hpp"
#include "tenured_space.hpp" #include "tenured_space.hpp"
#include "data_heap.hpp" #include "data_heap.hpp"

View File

@ -1,8 +0,0 @@
namespace factor {
struct nursery_space : bump_allocator<object> {
nursery_space(cell size, cell start)
: bump_allocator<object>(size, start) {}
};
}

View File

@ -18,7 +18,7 @@ struct factor_vm {
/* New objects are allocated here, use the data->nursery reference /* New objects are allocated here, use the data->nursery reference
instead from c++ code. */ instead from c++ code. */
nursery_space nursery; bump_allocator nursery;
/* Add this to a shifted address to compute write barrier offsets */ /* Add this to a shifted address to compute write barrier offsets */
cell cards_offset; cell cards_offset;