< prev index next >

src/hotspot/share/gc/g1/g1CardTable.inline.hpp

Print this page
rev 56673 : imported patch 8227739-merge-scan-rs-update-rs-cost

*** 31,74 **** inline uint G1CardTable::region_idx_for(CardValue* p) { size_t const card_idx = pointer_delta(p, _byte_map, sizeof(CardValue)); return (uint)(card_idx >> (HeapRegion::LogOfHRGrainBytes - card_shift)); } ! inline void G1CardTable::mark_clean_as_dirty(size_t card_index) { CardValue value = _byte_map[card_index]; if (value == clean_card_val()) { _byte_map[card_index] = dirty_card_val(); } } ! inline void G1CardTable::mark_region_dirty(size_t start_card_index, size_t num_cards) { assert(is_aligned(start_card_index, sizeof(size_t)), "Start card index must be aligned."); assert(is_aligned(num_cards, sizeof(size_t)), "Number of cards to change must be evenly divisible."); size_t const num_chunks = num_cards / sizeof(size_t); size_t* cur_word = (size_t*)&_byte_map[start_card_index]; size_t* const end_word_map = cur_word + num_chunks; while (cur_word < end_word_map) { size_t value = *cur_word; if (value == WordAllClean) { *cur_word = WordAllDirty; } else if (value == WordAllDirty) { // do nothing. } else { // There is a mix of cards in there. Tread slowly. CardValue* cur = (CardValue*)cur_word; for (size_t i = 0; i < sizeof(size_t); i++) { CardValue value = *cur; if (value == clean_card_val()) { *cur = dirty_card_val(); } cur++; } } cur_word++; } } inline void G1CardTable::mark_as_scanned(size_t start_card_index, size_t num_cards) { CardValue* start = &_byte_map[start_card_index]; CardValue* const end = start + num_cards; --- 31,82 ---- inline uint G1CardTable::region_idx_for(CardValue* p) { size_t const card_idx = pointer_delta(p, _byte_map, sizeof(CardValue)); return (uint)(card_idx >> (HeapRegion::LogOfHRGrainBytes - card_shift)); } ! inline size_t G1CardTable::mark_clean_as_dirty(size_t card_index) { CardValue value = _byte_map[card_index]; if (value == clean_card_val()) { _byte_map[card_index] = dirty_card_val(); + return 1; } + return 0; } ! inline size_t G1CardTable::mark_region_dirty(size_t start_card_index, size_t num_cards) { assert(is_aligned(start_card_index, sizeof(size_t)), "Start card index must be aligned."); assert(is_aligned(num_cards, sizeof(size_t)), "Number of cards to change must be evenly divisible."); + size_t result = 0; + size_t const num_chunks = num_cards / sizeof(size_t); size_t* cur_word = (size_t*)&_byte_map[start_card_index]; size_t* const end_word_map = cur_word + num_chunks; while (cur_word < end_word_map) { size_t value = *cur_word; if (value == WordAllClean) { *cur_word = WordAllDirty; + result += sizeof(value); } else if (value == WordAllDirty) { // do nothing. } else { // There is a mix of cards in there. Tread slowly. CardValue* cur = (CardValue*)cur_word; for (size_t i = 0; i < sizeof(size_t); i++) { CardValue value = *cur; if (value == clean_card_val()) { *cur = dirty_card_val(); + result++; } cur++; } } cur_word++; } + + return result; } inline void G1CardTable::mark_as_scanned(size_t start_card_index, size_t num_cards) { CardValue* start = &_byte_map[start_card_index]; CardValue* const end = start + num_cards;
< prev index next >