4 const int forwarding_granularity = 128;
6 template<typename Block, int Granularity> struct mark_bits {
15 void clear_mark_bits()
17 memset(marked,0,bits_size * sizeof(unsigned int));
20 void clear_free_bits()
22 memset(freed,0,bits_size * sizeof(unsigned int));
25 void clear_forwarding()
27 memset(forwarding,0,forwarding_size * sizeof(cell));
30 explicit mark_bits(cell start_, cell size_) :
33 bits_size(size / Granularity / 32),
34 marked(new unsigned int[bits_size]),
35 freed(new unsigned int[bits_size]),
36 forwarding_size(size / Granularity / forwarding_granularity),
37 forwarding(new cell[forwarding_size])
54 std::pair<cell,cell> bitmap_deref(Block *address)
56 cell word_number = (((cell)address - start) / Granularity);
57 cell word_index = (word_number >> 5);
58 cell word_shift = (word_number & 31);
61 assert(word_index < bits_size);
64 return std::make_pair(word_index,word_shift);
67 bool bitmap_elt(unsigned int *bits, Block *address)
69 std::pair<cell,cell> pair = bitmap_deref(address);
70 return (bits[pair.first] & (1 << pair.second)) != 0;
73 void set_bitmap_elt(unsigned int *bits, Block *address, bool flag)
75 std::pair<cell,cell> pair = bitmap_deref(address);
77 bits[pair.first] |= (1 << pair.second);
79 bits[pair.first] &= ~(1 << pair.second);
82 bool is_marked_p(Block *address)
84 return bitmap_elt(marked,address);
87 void set_marked_p(Block *address, bool marked_p)
89 set_bitmap_elt(marked,address,marked_p);
92 bool is_free_p(Block *address)
94 return bitmap_elt(freed,address);
97 void set_free_p(Block *address, bool free_p)
99 set_bitmap_elt(freed,address,free_p);