comparison src/share/vm/gc_implementation/g1/g1RemSet.cpp @ 796:29e7d79232b9

6819065: G1: eliminate high serial card table clearing time Reviewed-by: iveresov, tonyp
author apetrusenko
date Tue, 19 May 2009 04:05:31 -0700
parents 315a5d70b295
children df6caf649ff7
comparison
equal deleted inserted replaced
795:215f81b4d9b3 796:29e7d79232b9
217 bool doHeapRegion(HeapRegion* r) { 217 bool doHeapRegion(HeapRegion* r) {
218 assert(r->in_collection_set(), "should only be called on elements of CS."); 218 assert(r->in_collection_set(), "should only be called on elements of CS.");
219 HeapRegionRemSet* hrrs = r->rem_set(); 219 HeapRegionRemSet* hrrs = r->rem_set();
220 if (hrrs->iter_is_complete()) return false; // All done. 220 if (hrrs->iter_is_complete()) return false; // All done.
221 if (!_try_claimed && !hrrs->claim_iter()) return false; 221 if (!_try_claimed && !hrrs->claim_iter()) return false;
222 _g1h->push_dirty_cards_region(r);
222 // If we didn't return above, then 223 // If we didn't return above, then
223 // _try_claimed || r->claim_iter() 224 // _try_claimed || r->claim_iter()
224 // is true: either we're supposed to work on claimed-but-not-complete 225 // is true: either we're supposed to work on claimed-but-not-complete
225 // regions, or we successfully claimed the region. 226 // regions, or we successfully claimed the region.
226 HeapRegionRemSetIterator* iter = _g1h->rem_set_iterator(_worker_i); 227 HeapRegionRemSetIterator* iter = _g1h->rem_set_iterator(_worker_i);
239 #endif 240 #endif
240 241
241 HeapRegion* card_region = _g1h->heap_region_containing(card_start); 242 HeapRegion* card_region = _g1h->heap_region_containing(card_start);
242 assert(card_region != NULL, "Yielding cards not in the heap?"); 243 assert(card_region != NULL, "Yielding cards not in the heap?");
243 _cards++; 244 _cards++;
245
246 if (!card_region->is_on_dirty_cards_region_list()) {
247 _g1h->push_dirty_cards_region(card_region);
248 }
244 249
245 // If the card is dirty, then we will scan it during updateRS. 250 // If the card is dirty, then we will scan it during updateRS.
246 if (!card_region->in_collection_set() && !_ct_bs->is_card_dirty(card_index)) { 251 if (!card_region->in_collection_set() && !_ct_bs->is_card_dirty(card_index)) {
247 if (!_ct_bs->is_card_claimed(card_index) && _ct_bs->claim_card(card_index)) { 252 if (!_ct_bs->is_card_claimed(card_index) && _ct_bs->claim_card(card_index)) {
248 scanCard(card_index, card_region); 253 scanCard(card_index, card_region);