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 }
|