104 lines
2.0 KiB
C++
104 lines
2.0 KiB
C++
namespace factor
|
|
{
|
|
|
|
const int forwarding_granularity = 128;
|
|
|
|
template<typename Block, int Granularity> struct mark_bits {
|
|
cell start;
|
|
cell size;
|
|
cell bits_size;
|
|
unsigned int *marked;
|
|
unsigned int *freed;
|
|
cell forwarding_size;
|
|
cell *forwarding;
|
|
|
|
void clear_mark_bits()
|
|
{
|
|
memset(marked,0,bits_size * sizeof(unsigned int));
|
|
}
|
|
|
|
void clear_free_bits()
|
|
{
|
|
memset(freed,0,bits_size * sizeof(unsigned int));
|
|
}
|
|
|
|
void clear_forwarding()
|
|
{
|
|
memset(forwarding,0,forwarding_size * sizeof(cell));
|
|
}
|
|
|
|
explicit mark_bits(cell start_, cell size_) :
|
|
start(start_),
|
|
size(size_),
|
|
bits_size(size / Granularity / 32),
|
|
marked(new unsigned int[bits_size]),
|
|
freed(new unsigned int[bits_size]),
|
|
forwarding_size(size / Granularity / forwarding_granularity),
|
|
forwarding(new cell[forwarding_size])
|
|
{
|
|
clear_mark_bits();
|
|
clear_free_bits();
|
|
clear_forwarding();
|
|
}
|
|
|
|
~mark_bits()
|
|
{
|
|
delete[] marked;
|
|
marked = NULL;
|
|
delete[] freed;
|
|
freed = NULL;
|
|
delete[] forwarding;
|
|
forwarding = NULL;
|
|
}
|
|
|
|
std::pair<cell,cell> bitmap_deref(Block *address)
|
|
{
|
|
cell word_number = (((cell)address - start) / Granularity);
|
|
cell word_index = (word_number >> 5);
|
|
cell word_shift = (word_number & 31);
|
|
|
|
#ifdef FACTOR_DEBUG
|
|
assert(word_index < bits_size);
|
|
#endif
|
|
|
|
return std::make_pair(word_index,word_shift);
|
|
}
|
|
|
|
bool bitmap_elt(unsigned int *bits, Block *address)
|
|
{
|
|
std::pair<cell,cell> pair = bitmap_deref(address);
|
|
return (bits[pair.first] & (1 << pair.second)) != 0;
|
|
}
|
|
|
|
void set_bitmap_elt(unsigned int *bits, Block *address, bool flag)
|
|
{
|
|
std::pair<cell,cell> pair = bitmap_deref(address);
|
|
if(flag)
|
|
bits[pair.first] |= (1 << pair.second);
|
|
else
|
|
bits[pair.first] &= ~(1 << pair.second);
|
|
}
|
|
|
|
bool is_marked_p(Block *address)
|
|
{
|
|
return bitmap_elt(marked,address);
|
|
}
|
|
|
|
void set_marked_p(Block *address, bool marked_p)
|
|
{
|
|
set_bitmap_elt(marked,address,marked_p);
|
|
}
|
|
|
|
bool is_free_p(Block *address)
|
|
{
|
|
return bitmap_elt(freed,address);
|
|
}
|
|
|
|
void set_free_p(Block *address, bool free_p)
|
|
{
|
|
set_bitmap_elt(freed,address,free_p);
|
|
}
|
|
};
|
|
|
|
}
|