VM: Refactor object_start_map* to Factor style

db4
Erik Charlebois 2013-05-11 22:16:45 -04:00
parent bac6919705
commit 56ceeb582a
2 changed files with 63 additions and 81 deletions

View File

@ -1,95 +1,78 @@
#include "master.hpp" #include "master.hpp"
namespace factor namespace factor {
{
object_start_map::object_start_map(cell size_, cell start_) : object_start_map::object_start_map(cell size_, cell start_)
size(size_), start(start_) : size(size_), start(start_) {
{ object_start_offsets = new card[addr_to_card(size_)];
object_start_offsets = new card[addr_to_card(size_)]; object_start_offsets_end = object_start_offsets + addr_to_card(size_);
object_start_offsets_end = object_start_offsets + addr_to_card(size_); clear_object_start_offsets();
clear_object_start_offsets();
} }
object_start_map::~object_start_map() object_start_map::~object_start_map() { delete[] object_start_offsets; }
{
delete[] object_start_offsets; cell object_start_map::first_object_in_card(cell card_index) {
return object_start_offsets[card_index];
} }
cell object_start_map::first_object_in_card(cell card_index) cell object_start_map::find_object_containing_card(cell card_index) {
{ if (card_index == 0)
return object_start_offsets[card_index]; return start;
} else {
card_index--;
cell object_start_map::find_object_containing_card(cell card_index) while (first_object_in_card(card_index) == card_starts_inside_object) {
{
if(card_index == 0)
return start;
else
{
card_index--;
while(first_object_in_card(card_index) == card_starts_inside_object)
{
#ifdef FACTOR_DEBUG #ifdef FACTOR_DEBUG
/* First card should start with an object */ /* First card should start with an object */
FACTOR_ASSERT(card_index > 0); FACTOR_ASSERT(card_index > 0);
#endif #endif
card_index--; card_index--;
} }
return start + (card_index << card_bits) + first_object_in_card(card_index); return start + (card_index << card_bits) + first_object_in_card(card_index);
} }
} }
/* we need to remember the first object allocated in the card */ /* we need to remember the first object allocated in the card */
void object_start_map::record_object_start_offset(object *obj) void object_start_map::record_object_start_offset(object* obj) {
{ cell idx = addr_to_card((cell) obj - start);
cell idx = addr_to_card((cell)obj - start); card obj_start = ((cell) obj & addr_card_mask);
card obj_start = ((cell)obj & addr_card_mask); object_start_offsets[idx] = std::min(object_start_offsets[idx], obj_start);
object_start_offsets[idx] = std::min(object_start_offsets[idx],obj_start);
} }
void object_start_map::clear_object_start_offsets() void object_start_map::clear_object_start_offsets() {
{ memset(object_start_offsets, card_starts_inside_object, addr_to_card(size));
memset(object_start_offsets,card_starts_inside_object,addr_to_card(size));
} }
void object_start_map::update_card_for_sweep(cell index, u16 mask) void object_start_map::update_card_for_sweep(cell index, u16 mask) {
{ cell offset = object_start_offsets[index];
cell offset = object_start_offsets[index]; if (offset != card_starts_inside_object) {
if(offset != card_starts_inside_object) mask >>= (offset / data_alignment);
{
mask >>= (offset / data_alignment);
if(mask == 0) if (mask == 0) {
{ /* The rest of the block after the old object start is free */
/* The rest of the block after the old object start is free */ object_start_offsets[index] = card_starts_inside_object;
object_start_offsets[index] = card_starts_inside_object; } else {
} /* Move the object start forward if necessary */
else object_start_offsets[index] =
{ (card)(offset + (rightmost_set_bit(mask) * data_alignment));
/* Move the object start forward if necessary */ }
object_start_offsets[index] = (card)(offset + (rightmost_set_bit(mask) * data_alignment)); }
}
}
} }
void object_start_map::update_for_sweep(mark_bits<object> *state) void object_start_map::update_for_sweep(mark_bits<object>* state) {
{ for (cell index = 0; index < state->bits_size; index++) {
for(cell index = 0; index < state->bits_size; index++) cell mask = state->marked[index];
{
cell mask = state->marked[index];
#ifdef FACTOR_64 #ifdef FACTOR_64
update_card_for_sweep(index * 4, mask & 0xffff); update_card_for_sweep(index * 4, mask & 0xffff);
update_card_for_sweep(index * 4 + 1, (mask >> 16) & 0xffff); update_card_for_sweep(index * 4 + 1, (mask >> 16) & 0xffff);
update_card_for_sweep(index * 4 + 2, (mask >> 32) & 0xffff); update_card_for_sweep(index * 4 + 2, (mask >> 32) & 0xffff);
update_card_for_sweep(index * 4 + 3, (mask >> 48) & 0xffff); update_card_for_sweep(index * 4 + 3, (mask >> 48) & 0xffff);
#else #else
update_card_for_sweep(index * 2, mask & 0xffff); update_card_for_sweep(index * 2, mask & 0xffff);
update_card_for_sweep(index * 2 + 1, (mask >> 16) & 0xffff); update_card_for_sweep(index * 2 + 1, (mask >> 16) & 0xffff);
#endif #endif
} }
} }
} }

View File

@ -1,22 +1,21 @@
namespace factor namespace factor {
{
static const cell card_starts_inside_object = 0xff; static const cell card_starts_inside_object = 0xff;
struct object_start_map { struct object_start_map {
cell size, start; cell size, start;
card *object_start_offsets; card* object_start_offsets;
card *object_start_offsets_end; card* object_start_offsets_end;
explicit object_start_map(cell size_, cell start_); explicit object_start_map(cell size_, cell start_);
~object_start_map(); ~object_start_map();
cell first_object_in_card(cell card_index); cell first_object_in_card(cell card_index);
cell find_object_containing_card(cell card_index); cell find_object_containing_card(cell card_index);
void record_object_start_offset(object *obj); void record_object_start_offset(object* obj);
void clear_object_start_offsets(); void clear_object_start_offsets();
void update_card_for_sweep(cell index, u16 mask); void update_card_for_sweep(cell index, u16 mask);
void update_for_sweep(mark_bits<object> *state); void update_for_sweep(mark_bits<object>* state);
}; };
} }