875 |
875 |
876 bool HeapRegionRemSet::iter_is_complete() { |
876 bool HeapRegionRemSet::iter_is_complete() { |
877 return _iter_state == Complete; |
877 return _iter_state == Complete; |
878 } |
878 } |
879 |
879 |
880 void HeapRegionRemSet::init_iterator(HeapRegionRemSetIterator* iter) const { |
|
881 iter->initialize(this); |
|
882 } |
|
883 |
|
884 #ifndef PRODUCT |
880 #ifndef PRODUCT |
885 void HeapRegionRemSet::print() const { |
881 void HeapRegionRemSet::print() const { |
886 HeapRegionRemSetIterator iter; |
882 HeapRegionRemSetIterator iter(this); |
887 init_iterator(&iter); |
|
888 size_t card_index; |
883 size_t card_index; |
889 while (iter.has_next(card_index)) { |
884 while (iter.has_next(card_index)) { |
890 HeapWord* card_start = |
885 HeapWord* card_start = |
891 G1CollectedHeap::heap()->bot_shared()->address_for_index(card_index); |
886 G1CollectedHeap::heap()->bot_shared()->address_for_index(card_index); |
892 gclog_or_tty->print_cr(" Card " PTR_FORMAT, card_start); |
887 gclog_or_tty->print_cr(" Card " PTR_FORMAT, card_start); |
926 _other_regions.scrub(ctbs, region_bm, card_bm); |
921 _other_regions.scrub(ctbs, region_bm, card_bm); |
927 } |
922 } |
928 |
923 |
929 //-------------------- Iteration -------------------- |
924 //-------------------- Iteration -------------------- |
930 |
925 |
931 HeapRegionRemSetIterator:: |
926 HeapRegionRemSetIterator:: HeapRegionRemSetIterator(const HeapRegionRemSet* hrrs) : |
932 HeapRegionRemSetIterator() : |
927 _hrrs(hrrs), |
933 _hrrs(NULL), |
|
934 _g1h(G1CollectedHeap::heap()), |
928 _g1h(G1CollectedHeap::heap()), |
935 _bosa(NULL), |
929 _coarse_map(&hrrs->_other_regions._coarse_map), |
936 _sparse_iter() { } |
930 _fine_grain_regions(hrrs->_other_regions._fine_grain_regions), |
937 |
931 _bosa(hrrs->bosa()), |
938 void HeapRegionRemSetIterator::initialize(const HeapRegionRemSet* hrrs) { |
932 _is(Sparse), |
939 _hrrs = hrrs; |
|
940 _coarse_map = &_hrrs->_other_regions._coarse_map; |
|
941 _fine_grain_regions = _hrrs->_other_regions._fine_grain_regions; |
|
942 _bosa = _hrrs->bosa(); |
|
943 |
|
944 _is = Sparse; |
|
945 // Set these values so that we increment to the first region. |
933 // Set these values so that we increment to the first region. |
946 _coarse_cur_region_index = -1; |
934 _coarse_cur_region_index(-1), |
947 _coarse_cur_region_cur_card = (HeapRegion::CardsPerRegion-1); |
935 _coarse_cur_region_cur_card(HeapRegion::CardsPerRegion-1), |
948 |
936 _cur_region_cur_card(0), |
949 _cur_region_cur_card = 0; |
937 _fine_array_index(-1), |
950 |
938 _fine_cur_prt(NULL), |
951 _fine_array_index = -1; |
939 _n_yielded_coarse(0), |
952 _fine_cur_prt = NULL; |
940 _n_yielded_fine(0), |
953 |
941 _n_yielded_sparse(0), |
954 _n_yielded_coarse = 0; |
942 _sparse_iter(&hrrs->_other_regions._sparse_table) {} |
955 _n_yielded_fine = 0; |
|
956 _n_yielded_sparse = 0; |
|
957 |
|
958 _sparse_iter.init(&hrrs->_other_regions._sparse_table); |
|
959 } |
|
960 |
943 |
961 bool HeapRegionRemSetIterator::coarse_has_next(size_t& card_index) { |
944 bool HeapRegionRemSetIterator::coarse_has_next(size_t& card_index) { |
962 if (_hrrs->_other_regions._n_coarse_entries == 0) return false; |
945 if (_hrrs->_other_regions._n_coarse_entries == 0) return false; |
963 // Go to the next card. |
946 // Go to the next card. |
964 _coarse_cur_region_cur_card++; |
947 _coarse_cur_region_cur_card++; |
1207 // Now cause a coarsening. |
1190 // Now cause a coarsening. |
1208 hrrs->add_reference((OopOrNarrowOopStar)hr4->bottom()); |
1191 hrrs->add_reference((OopOrNarrowOopStar)hr4->bottom()); |
1209 hrrs->add_reference((OopOrNarrowOopStar)hr5->bottom()); |
1192 hrrs->add_reference((OopOrNarrowOopStar)hr5->bottom()); |
1210 |
1193 |
1211 // Now, does iteration yield these three? |
1194 // Now, does iteration yield these three? |
1212 HeapRegionRemSetIterator iter; |
1195 HeapRegionRemSetIterator iter(hrrs); |
1213 hrrs->init_iterator(&iter); |
|
1214 size_t sum = 0; |
1196 size_t sum = 0; |
1215 size_t card_index; |
1197 size_t card_index; |
1216 while (iter.has_next(card_index)) { |
1198 while (iter.has_next(card_index)) { |
1217 HeapWord* card_start = |
1199 HeapWord* card_start = |
1218 G1CollectedHeap::heap()->bot_shared()->address_for_index(card_index); |
1200 G1CollectedHeap::heap()->bot_shared()->address_for_index(card_index); |