379 invalidate(0, _max_regions); |
379 invalidate(0, _max_regions); |
380 } |
380 } |
381 |
381 |
382 void FromCardCache::invalidate(uint start_idx, size_t new_num_regions) { |
382 void FromCardCache::invalidate(uint start_idx, size_t new_num_regions) { |
383 guarantee((size_t)start_idx + new_num_regions <= max_uintx, |
383 guarantee((size_t)start_idx + new_num_regions <= max_uintx, |
384 err_msg("Trying to invalidate beyond maximum region, from %u size "SIZE_FORMAT, |
384 err_msg("Trying to invalidate beyond maximum region, from %u size " SIZE_FORMAT, |
385 start_idx, new_num_regions)); |
385 start_idx, new_num_regions)); |
386 for (uint i = 0; i < HeapRegionRemSet::num_par_rem_sets(); i++) { |
386 for (uint i = 0; i < HeapRegionRemSet::num_par_rem_sets(); i++) { |
387 uint end_idx = (start_idx + (uint)new_num_regions); |
387 uint end_idx = (start_idx + (uint)new_num_regions); |
388 assert(end_idx <= _max_regions, "Must be within max."); |
388 assert(end_idx <= _max_regions, "Must be within max."); |
389 for (uint j = start_idx; j < end_idx; j++) { |
389 for (uint j = start_idx; j < end_idx; j++) { |
648 gclog_or_tty->print_cr("Scrubbing region %u:", hr()->hrm_index()); |
648 gclog_or_tty->print_cr("Scrubbing region %u:", hr()->hrm_index()); |
649 } |
649 } |
650 |
650 |
651 assert(_coarse_map.size() == region_bm->size(), "Precondition"); |
651 assert(_coarse_map.size() == region_bm->size(), "Precondition"); |
652 if (G1RSScrubVerbose) { |
652 if (G1RSScrubVerbose) { |
653 gclog_or_tty->print(" Coarse map: before = "SIZE_FORMAT"...", |
653 gclog_or_tty->print(" Coarse map: before = " SIZE_FORMAT "...", |
654 _n_coarse_entries); |
654 _n_coarse_entries); |
655 } |
655 } |
656 _coarse_map.set_intersection(*region_bm); |
656 _coarse_map.set_intersection(*region_bm); |
657 _n_coarse_entries = _coarse_map.count_one_bits(); |
657 _n_coarse_entries = _coarse_map.count_one_bits(); |
658 if (G1RSScrubVerbose) { |
658 if (G1RSScrubVerbose) { |
659 gclog_or_tty->print_cr(" after = "SIZE_FORMAT".", _n_coarse_entries); |
659 gclog_or_tty->print_cr(" after = " SIZE_FORMAT ".", _n_coarse_entries); |
660 } |
660 } |
661 |
661 |
662 // Now do the fine-grained maps. |
662 // Now do the fine-grained maps. |
663 for (size_t i = 0; i < _max_fine_entries; i++) { |
663 for (size_t i = 0; i < _max_fine_entries; i++) { |
664 PerRegionTable* cur = _fine_grain_regions[i]; |
664 PerRegionTable* cur = _fine_grain_regions[i]; |
1050 _cur_card_in_prt = _fine_cur_prt->_bm.get_next_one_offset(_cur_card_in_prt + 1); |
1050 _cur_card_in_prt = _fine_cur_prt->_bm.get_next_one_offset(_cur_card_in_prt + 1); |
1051 } |
1051 } |
1052 |
1052 |
1053 card_index = _cur_region_card_offset + _cur_card_in_prt; |
1053 card_index = _cur_region_card_offset + _cur_card_in_prt; |
1054 guarantee(_cur_card_in_prt < HeapRegion::CardsPerRegion, |
1054 guarantee(_cur_card_in_prt < HeapRegion::CardsPerRegion, |
1055 err_msg("Card index "SIZE_FORMAT" must be within the region", _cur_card_in_prt)); |
1055 err_msg("Card index " SIZE_FORMAT " must be within the region", _cur_card_in_prt)); |
1056 return true; |
1056 return true; |
1057 } |
1057 } |
1058 |
1058 |
1059 bool HeapRegionRemSetIterator::fine_has_next() { |
1059 bool HeapRegionRemSetIterator::fine_has_next() { |
1060 return _cur_card_in_prt != HeapRegion::CardsPerRegion; |
1060 return _cur_card_in_prt != HeapRegion::CardsPerRegion; |
1219 void PerRegionTable::test_fl_mem_size() { |
1219 void PerRegionTable::test_fl_mem_size() { |
1220 PerRegionTable* dummy = alloc(NULL); |
1220 PerRegionTable* dummy = alloc(NULL); |
1221 |
1221 |
1222 size_t min_prt_size = sizeof(void*) + dummy->bm()->size_in_words() * HeapWordSize; |
1222 size_t min_prt_size = sizeof(void*) + dummy->bm()->size_in_words() * HeapWordSize; |
1223 assert(dummy->mem_size() > min_prt_size, |
1223 assert(dummy->mem_size() > min_prt_size, |
1224 err_msg("PerRegionTable memory usage is suspiciously small, only has "SIZE_FORMAT" bytes. " |
1224 err_msg("PerRegionTable memory usage is suspiciously small, only has " SIZE_FORMAT " bytes. " |
1225 "Should be at least "SIZE_FORMAT" bytes.", dummy->mem_size(), min_prt_size)); |
1225 "Should be at least " SIZE_FORMAT " bytes.", dummy->mem_size(), min_prt_size)); |
1226 free(dummy); |
1226 free(dummy); |
1227 guarantee(dummy->mem_size() == fl_mem_size(), "fl_mem_size() does not return the correct element size"); |
1227 guarantee(dummy->mem_size() == fl_mem_size(), "fl_mem_size() does not return the correct element size"); |
1228 // try to reset the state |
1228 // try to reset the state |
1229 _free_list = NULL; |
1229 _free_list = NULL; |
1230 delete dummy; |
1230 delete dummy; |