--- old/src/share/vm/gc_implementation/g1/sparsePRT.cpp 2014-06-26 13:28:22.665134687 +0200 +++ new/src/share/vm/gc_implementation/g1/sparsePRT.cpp 2014-06-26 13:28:22.581134686 +0200 @@ -35,44 +35,44 @@ void SparsePRTEntry::init(RegionIdx_t region_ind) { _region_ind = region_ind; - _next_index = NullEntry; + _next_index = RSHashTable::NullEntry; + _next_null = 0; - for (int i = 0; i < cards_num(); i++) { - _cards[i] = NullEntry; - } } bool SparsePRTEntry::contains_card(CardIdx_t card_index) const { - for (int i = 0; i < cards_num(); i++) { + for (int i = 0; i < _next_null; i++) { if (_cards[i] == card_index) return true; } return false; } -int SparsePRTEntry::num_valid_cards() const { - int sum = 0; - for (int i = 0; i < cards_num(); i++) { - sum += (_cards[i] != NullEntry); - } - return sum; -} SparsePRTEntry::AddCardResult SparsePRTEntry::add_card(CardIdx_t card_index) { - for (int i = 0; i < cards_num(); i++) { - CardIdx_t c = _cards[i]; - if (c == card_index) return found; - if (c == NullEntry) { _cards[i] = card_index; return added; } + for (int i = 0; i < _next_null; i++) { + CardIdx_t c = card(i); + if (c == card_index) { + return found; + } } + if (_next_null < cards_num() -1) { + _cards[_next_null] = card_index; + _next_null++; + return added; + } // Otherwise, we're full. return overflow; } void SparsePRTEntry::copy_cards(CardIdx_t* cards) const { - memcpy(cards, _cards, cards_num() * sizeof(CardIdx_t)); + memcpy(cards, _cards, _next_null * sizeof(CardIdx_t)); } void SparsePRTEntry::copy_cards(SparsePRTEntry* e) const { - copy_cards(&e->_cards[0]); + copy_cards(e->_cards); + assert(_next_null >= 0, "invariant"); + assert(_next_null <= cards_num(), "invariant"); + e->_next_null = _next_null; } // ---------------------------------------------------------------------- @@ -220,18 +220,18 @@ assert(e2->num_valid_cards() > 0, "Postcondition."); } -CardIdx_t RSHashTableIter::find_first_card_in_list() { - CardIdx_t res; +bool RSHashTableIter::find_first_card_in_list(CardIdx_t & res) { while (_bl_ind != RSHashTable::NullEntry) { - res = _rsht->entry(_bl_ind)->card(0); - if (res != SparsePRTEntry::NullEntry) { - return res; + SparsePRTEntry * sparse_entry = _rsht->entry(_bl_ind); + if (sparse_entry->num_valid_cards() > 0) { + res = sparse_entry->card(0); + return true; } else { - _bl_ind = _rsht->entry(_bl_ind)->next_index(); + _bl_ind = sparse_entry->next_index(); } } // Otherwise, none found: - return SparsePRTEntry::NullEntry; + return false; } size_t RSHashTableIter::compute_card_ind(CardIdx_t ci) { @@ -241,19 +241,22 @@ bool RSHashTableIter::has_next(size_t& card_index) { _card_ind++; CardIdx_t ci; - if (_card_ind < SparsePRTEntry::cards_num() && - ((ci = _rsht->entry(_bl_ind)->card(_card_ind)) != - SparsePRTEntry::NullEntry)) { - card_index = compute_card_ind(ci); - return true; + if (_bl_ind >= 0) { + SparsePRTEntry * e = _rsht->entry(_bl_ind); + if (_card_ind < e->num_valid_cards()) { + ci = e->card(_card_ind); + card_index = compute_card_ind(ci); + return true; + } } + // Otherwise, must find the next valid entry. _card_ind = 0; if (_bl_ind != RSHashTable::NullEntry) { _bl_ind = _rsht->entry(_bl_ind)->next_index(); - ci = find_first_card_in_list(); - if (ci != SparsePRTEntry::NullEntry) { + bool found = find_first_card_in_list(ci); + if (found) { card_index = compute_card_ind(ci); return true; } @@ -262,8 +265,8 @@ _tbl_ind++; while ((size_t)_tbl_ind < _rsht->capacity()) { _bl_ind = _rsht->_buckets[_tbl_ind]; - ci = find_first_card_in_list(); - if (ci != SparsePRTEntry::NullEntry) { + bool found = find_first_card_in_list(ci); + if (found) { card_index = compute_card_ind(ci); return true; }