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);
 | 
						|
	}
 | 
						|
};
 | 
						|
 | 
						|
}
 |