31 inline uint G1CardTable::region_idx_for(CardValue* p) { |
31 inline uint G1CardTable::region_idx_for(CardValue* p) { |
32 size_t const card_idx = pointer_delta(p, _byte_map, sizeof(CardValue)); |
32 size_t const card_idx = pointer_delta(p, _byte_map, sizeof(CardValue)); |
33 return (uint)(card_idx >> (HeapRegion::LogOfHRGrainBytes - card_shift)); |
33 return (uint)(card_idx >> (HeapRegion::LogOfHRGrainBytes - card_shift)); |
34 } |
34 } |
35 |
35 |
36 inline void G1CardTable::mark_clean_as_dirty(size_t card_index) { |
36 inline size_t G1CardTable::mark_clean_as_dirty(size_t card_index) { |
37 CardValue value = _byte_map[card_index]; |
37 CardValue value = _byte_map[card_index]; |
38 if (value == clean_card_val()) { |
38 if (value == clean_card_val()) { |
39 _byte_map[card_index] = dirty_card_val(); |
39 _byte_map[card_index] = dirty_card_val(); |
|
40 return 1; |
40 } |
41 } |
|
42 return 0; |
41 } |
43 } |
42 |
44 |
43 inline void G1CardTable::mark_region_dirty(size_t start_card_index, size_t num_cards) { |
45 inline size_t G1CardTable::mark_region_dirty(size_t start_card_index, size_t num_cards) { |
44 assert(is_aligned(start_card_index, sizeof(size_t)), "Start card index must be aligned."); |
46 assert(is_aligned(start_card_index, sizeof(size_t)), "Start card index must be aligned."); |
45 assert(is_aligned(num_cards, sizeof(size_t)), "Number of cards to change must be evenly divisible."); |
47 assert(is_aligned(num_cards, sizeof(size_t)), "Number of cards to change must be evenly divisible."); |
|
48 |
|
49 size_t result = 0; |
46 |
50 |
47 size_t const num_chunks = num_cards / sizeof(size_t); |
51 size_t const num_chunks = num_cards / sizeof(size_t); |
48 |
52 |
49 size_t* cur_word = (size_t*)&_byte_map[start_card_index]; |
53 size_t* cur_word = (size_t*)&_byte_map[start_card_index]; |
50 size_t* const end_word_map = cur_word + num_chunks; |
54 size_t* const end_word_map = cur_word + num_chunks; |
51 while (cur_word < end_word_map) { |
55 while (cur_word < end_word_map) { |
52 size_t value = *cur_word; |
56 size_t value = *cur_word; |
53 if (value == WordAllClean) { |
57 if (value == WordAllClean) { |
54 *cur_word = WordAllDirty; |
58 *cur_word = WordAllDirty; |
|
59 result += sizeof(value); |
55 } else if (value == WordAllDirty) { |
60 } else if (value == WordAllDirty) { |
56 // do nothing. |
61 // do nothing. |
57 } else { |
62 } else { |
58 // There is a mix of cards in there. Tread slowly. |
63 // There is a mix of cards in there. Tread slowly. |
59 CardValue* cur = (CardValue*)cur_word; |
64 CardValue* cur = (CardValue*)cur_word; |
60 for (size_t i = 0; i < sizeof(size_t); i++) { |
65 for (size_t i = 0; i < sizeof(size_t); i++) { |
61 CardValue value = *cur; |
66 CardValue value = *cur; |
62 if (value == clean_card_val()) { |
67 if (value == clean_card_val()) { |
63 *cur = dirty_card_val(); |
68 *cur = dirty_card_val(); |
|
69 result++; |
64 } |
70 } |
65 cur++; |
71 cur++; |
66 } |
72 } |
67 } |
73 } |
68 cur_word++; |
74 cur_word++; |
69 } |
75 } |
|
76 |
|
77 return result; |
70 } |
78 } |
71 |
79 |
72 inline void G1CardTable::mark_as_scanned(size_t start_card_index, size_t num_cards) { |
80 inline void G1CardTable::mark_as_scanned(size_t start_card_index, size_t num_cards) { |
73 CardValue* start = &_byte_map[start_card_index]; |
81 CardValue* start = &_byte_map[start_card_index]; |
74 CardValue* const end = start + num_cards; |
82 CardValue* const end = start + num_cards; |