src/hotspot/share/gc/g1/g1CardTable.inline.hpp
changeset 59319 9ee940f1de90
parent 55510 3e31a8beaae4
equal deleted inserted replaced
59318:70021dbed82b 59319:9ee940f1de90
    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;