src/share/vm/gc_implementation/g1/g1RemSet.cpp

Print this page
rev 7324 : 8065358: Refactor G1s usage of save_marks and reduce related races
Summary: Stop using save_marks in G1 related code and make setting the replacement field less racy.
Reviewed-by:


 123     _cards_done(0),
 124     _worker_i(worker_i),
 125     _try_claimed(false)
 126   {
 127     _g1h = G1CollectedHeap::heap();
 128     _bot_shared = _g1h->bot_shared();
 129     _ct_bs = _g1h->g1_barrier_set();
 130     _block_size = MAX2<int>(G1RSetScanBlockSize, 1);
 131   }
 132 
 133   void set_try_claimed() { _try_claimed = true; }
 134 
 135   void scanCard(size_t index, HeapRegion *r) {
 136     // Stack allocate the DirtyCardToOopClosure instance
 137     HeapRegionDCTOC cl(_g1h, r, _oc,
 138                        CardTableModRefBS::Precise,
 139                        HeapRegionDCTOC::IntoCSFilterKind);
 140 
 141     // Set the "from" region in the closure.
 142     _oc->set_region(r);
 143     HeapWord* card_start = _bot_shared->address_for_index(index);
 144     HeapWord* card_end = card_start + G1BlockOffsetSharedArray::N_words;
 145     Space *sp = SharedHeap::heap()->space_containing(card_start);
 146     MemRegion sm_region = sp->used_region_at_save_marks();
 147     MemRegion mr = sm_region.intersection(MemRegion(card_start,card_end));
 148     if (!mr.is_empty() && !_ct_bs->is_card_claimed(index)) {
 149       // We make the card as "claimed" lazily (so races are possible
 150       // but they're benign), which reduces the number of duplicate
 151       // scans (the rsets of the regions in the cset can intersect).
 152       _ct_bs->set_card_claimed(index);
 153       _cards_done++;
 154       cl.do_MemRegion(mr);
 155     }
 156   }
 157 
 158   void printCard(HeapRegion* card_region, size_t card_index,
 159                  HeapWord* card_start) {
 160     gclog_or_tty->print_cr("T %u Region [" PTR_FORMAT ", " PTR_FORMAT ") "
 161                            "RS names card " SIZE_FORMAT_HEX ": "
 162                            "[" PTR_FORMAT ", " PTR_FORMAT ")",
 163                            _worker_i,
 164                            card_region->bottom(), card_region->end(),
 165                            card_index,
 166                            card_start, card_start + G1BlockOffsetSharedArray::N_words);
 167   }




 123     _cards_done(0),
 124     _worker_i(worker_i),
 125     _try_claimed(false)
 126   {
 127     _g1h = G1CollectedHeap::heap();
 128     _bot_shared = _g1h->bot_shared();
 129     _ct_bs = _g1h->g1_barrier_set();
 130     _block_size = MAX2<int>(G1RSetScanBlockSize, 1);
 131   }
 132 
 133   void set_try_claimed() { _try_claimed = true; }
 134 
 135   void scanCard(size_t index, HeapRegion *r) {
 136     // Stack allocate the DirtyCardToOopClosure instance
 137     HeapRegionDCTOC cl(_g1h, r, _oc,
 138                        CardTableModRefBS::Precise,
 139                        HeapRegionDCTOC::IntoCSFilterKind);
 140 
 141     // Set the "from" region in the closure.
 142     _oc->set_region(r);
 143     MemRegion card_region(_bot_shared->address_for_index(index), G1BlockOffsetSharedArray::N_words);
 144     MemRegion pre_gc_allocated(r->bottom(), r->scan_top());
 145     MemRegion mr = pre_gc_allocated.intersection(card_region);


 146     if (!mr.is_empty() && !_ct_bs->is_card_claimed(index)) {
 147       // We make the card as "claimed" lazily (so races are possible
 148       // but they're benign), which reduces the number of duplicate
 149       // scans (the rsets of the regions in the cset can intersect).
 150       _ct_bs->set_card_claimed(index);
 151       _cards_done++;
 152       cl.do_MemRegion(mr);
 153     }
 154   }
 155 
 156   void printCard(HeapRegion* card_region, size_t card_index,
 157                  HeapWord* card_start) {
 158     gclog_or_tty->print_cr("T %u Region [" PTR_FORMAT ", " PTR_FORMAT ") "
 159                            "RS names card " SIZE_FORMAT_HEX ": "
 160                            "[" PTR_FORMAT ", " PTR_FORMAT ")",
 161                            _worker_i,
 162                            card_region->bottom(), card_region->end(),
 163                            card_index,
 164                            card_start, card_start + G1BlockOffsetSharedArray::N_words);
 165   }