5 object_start_map::object_start_map(cell size, cell start)
6 : size(size), start(start) {
7 object_start_offsets = new card[addr_to_card(size)];
8 object_start_offsets_end = object_start_offsets + addr_to_card(size);
9 clear_object_start_offsets();
12 object_start_map::~object_start_map() { delete[] object_start_offsets; }
14 cell object_start_map::first_object_in_card(cell card_index) {
15 return object_start_offsets[card_index];
18 cell object_start_map::find_object_containing_card(cell card_index) {
24 while (first_object_in_card(card_index) == card_starts_inside_object) {
25 /* First card should start with an object */
26 FACTOR_ASSERT(card_index > 0);
30 return start + (card_index << card_bits) + first_object_in_card(card_index);
34 /* we need to remember the first object allocated in the card */
35 void object_start_map::record_object_start_offset(object* obj) {
36 cell idx = addr_to_card((cell) obj - start);
37 card obj_start = ((cell) obj & addr_card_mask);
38 object_start_offsets[idx] = std::min(object_start_offsets[idx], obj_start);
41 void object_start_map::clear_object_start_offsets() {
42 memset(object_start_offsets, card_starts_inside_object, addr_to_card(size));
45 void object_start_map::update_card_for_sweep(cell index, u16 mask) {
46 cell offset = object_start_offsets[index];
47 if (offset != card_starts_inside_object) {
48 mask >>= (offset / data_alignment);
51 /* The rest of the block after the old object start is free */
52 object_start_offsets[index] = card_starts_inside_object;
54 /* Move the object start forward if necessary */
55 object_start_offsets[index] =
56 (card)(offset + (rightmost_set_bit(mask) * data_alignment));
61 void object_start_map::update_for_sweep(mark_bits<object>* state) {
62 for (cell index = 0; index < state->bits_size; index++) {
63 cell mask = state->marked[index];
65 update_card_for_sweep(index * 4, mask & 0xffff);
66 update_card_for_sweep(index * 4 + 1, (mask >> 16) & 0xffff);
67 update_card_for_sweep(index * 4 + 2, (mask >> 32) & 0xffff);
68 update_card_for_sweep(index * 4 + 3, (mask >> 48) & 0xffff);
70 update_card_for_sweep(index * 2, mask & 0xffff);
71 update_card_for_sweep(index * 2 + 1, (mask >> 16) & 0xffff);