equal
deleted
inserted
replaced
690 |
690 |
691 HeapRegionRemSet::HeapRegionRemSet(G1BlockOffsetTable* bot, |
691 HeapRegionRemSet::HeapRegionRemSet(G1BlockOffsetTable* bot, |
692 HeapRegion* hr) |
692 HeapRegion* hr) |
693 : _bot(bot), |
693 : _bot(bot), |
694 _m(Mutex::leaf, FormatBuffer<128>("HeapRegionRemSet lock #%u", hr->hrm_index()), true, Monitor::_safepoint_check_never), |
694 _m(Mutex::leaf, FormatBuffer<128>("HeapRegionRemSet lock #%u", hr->hrm_index()), true, Monitor::_safepoint_check_never), |
695 _code_roots(), _other_regions(hr, &_m), _iter_state(Unclaimed), _iter_claimed(0) { |
695 _code_roots(), |
696 reset_for_par_iteration(); |
696 _other_regions(hr, &_m) { |
697 } |
697 } |
698 |
698 |
699 void HeapRegionRemSet::setup_remset_size() { |
699 void HeapRegionRemSet::setup_remset_size() { |
700 // Setup sparse and fine-grain tables sizes. |
700 // Setup sparse and fine-grain tables sizes. |
701 // table_size = base * (log(region_size / 1M) + 1) |
701 // table_size = base * (log(region_size / 1M) + 1) |
706 } |
706 } |
707 if (FLAG_IS_DEFAULT(G1RSetRegionEntries)) { |
707 if (FLAG_IS_DEFAULT(G1RSetRegionEntries)) { |
708 G1RSetRegionEntries = G1RSetRegionEntriesBase * (region_size_log_mb + 1); |
708 G1RSetRegionEntries = G1RSetRegionEntriesBase * (region_size_log_mb + 1); |
709 } |
709 } |
710 guarantee(G1RSetSparseRegionEntries > 0 && G1RSetRegionEntries > 0 , "Sanity"); |
710 guarantee(G1RSetSparseRegionEntries > 0 && G1RSetRegionEntries > 0 , "Sanity"); |
711 } |
|
712 |
|
713 bool HeapRegionRemSet::claim_iter() { |
|
714 if (_iter_state != Unclaimed) return false; |
|
715 jint res = Atomic::cmpxchg(Claimed, (jint*)(&_iter_state), Unclaimed); |
|
716 return (res == Unclaimed); |
|
717 } |
|
718 |
|
719 void HeapRegionRemSet::set_iter_complete() { |
|
720 _iter_state = Complete; |
|
721 } |
|
722 |
|
723 bool HeapRegionRemSet::iter_is_complete() { |
|
724 return _iter_state == Complete; |
|
725 } |
711 } |
726 |
712 |
727 #ifndef PRODUCT |
713 #ifndef PRODUCT |
728 void HeapRegionRemSet::print() { |
714 void HeapRegionRemSet::print() { |
729 HeapRegionRemSetIterator iter(this); |
715 HeapRegionRemSetIterator iter(this); |
758 |
744 |
759 void HeapRegionRemSet::clear_locked() { |
745 void HeapRegionRemSet::clear_locked() { |
760 _code_roots.clear(); |
746 _code_roots.clear(); |
761 _other_regions.clear(); |
747 _other_regions.clear(); |
762 assert(occupied_locked() == 0, "Should be clear."); |
748 assert(occupied_locked() == 0, "Should be clear."); |
763 reset_for_par_iteration(); |
|
764 } |
|
765 |
|
766 void HeapRegionRemSet::reset_for_par_iteration() { |
|
767 _iter_state = Unclaimed; |
|
768 _iter_claimed = 0; |
|
769 // It's good to check this to make sure that the two methods are in sync. |
|
770 assert(verify_ready_for_par_iteration(), "post-condition"); |
|
771 } |
749 } |
772 |
750 |
773 void HeapRegionRemSet::scrub(G1CardLiveData* live_data) { |
751 void HeapRegionRemSet::scrub(G1CardLiveData* live_data) { |
774 _other_regions.scrub(live_data); |
752 _other_regions.scrub(live_data); |
775 } |
753 } |