hotspot/src/share/vm/gc/g1/heapRegionRemSet.cpp
changeset 37988 bf4018edea5e
parent 37414 2672ba9af0dc
child 38156 e0ff734fa7de
equal deleted inserted replaced
37987:7b0667c9e794 37988:bf4018edea5e
   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 }