673 r->oops_on_card_seq_iterate_careful(dirtyRegion, |
673 r->oops_on_card_seq_iterate_careful(dirtyRegion, |
674 &filter_then_update_rs_oop_cl, |
674 &filter_then_update_rs_oop_cl, |
675 card_ptr); |
675 card_ptr); |
676 |
676 |
677 // If unable to process the card then we encountered an unparsable |
677 // If unable to process the card then we encountered an unparsable |
678 // part of the heap (e.g. a partially allocated object). Redirty |
678 // part of the heap (e.g. a partially allocated object) while |
679 // and re-enqueue: if we put off the card until a GC pause, then the |
679 // processing a stale card. Despite the card being stale, redirty |
680 // allocation will have completed. |
680 // and re-enqueue, because we've already cleaned the card. Without |
|
681 // this we could incorrectly discard a non-stale card. |
681 if (!card_processed) { |
682 if (!card_processed) { |
682 assert(!_g1->is_gc_active(), "Unparsable heap during GC"); |
683 assert(!_g1->is_gc_active(), "Unparsable heap during GC"); |
683 // The card might have gotten re-dirtied and re-enqueued while we |
684 // The card might have gotten re-dirtied and re-enqueued while we |
684 // worked. (In fact, it's pretty likely.) |
685 // worked. (In fact, it's pretty likely.) |
685 if (*card_ptr != CardTableModRefBS::dirty_card_val()) { |
686 if (*card_ptr != CardTableModRefBS::dirty_card_val()) { |