< prev index next >

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

Print this page
rev 12238 : [mq]: invalidate_unprocessed

*** 673,697 **** r->oops_on_card_seq_iterate_careful(dirtyRegion, &filter_then_update_rs_oop_cl, card_ptr); // If unable to process the card then we encountered an unparsable ! // part of the heap (e.g. a partially allocated object). Redirty ! // and re-enqueue: if we put off the card until a GC pause, then the ! // allocation will have completed. if (!card_processed) { assert(!_g1->is_gc_active(), "Unparsable heap during GC"); ! // The card might have gotten re-dirtied and re-enqueued while we ! // worked. (In fact, it's pretty likely.) ! if (*card_ptr != CardTableModRefBS::dirty_card_val()) { ! *card_ptr = CardTableModRefBS::dirty_card_val(); ! MutexLockerEx x(Shared_DirtyCardQ_lock, ! Mutex::_no_safepoint_check_flag); ! DirtyCardQueue* sdcq = ! JavaThread::dirty_card_queue_set().shared_dirty_card_queue(); ! sdcq->enqueue(card_ptr); ! } } else { _conc_refine_cards++; } // This gets set to true if the card being refined has --- 673,692 ---- r->oops_on_card_seq_iterate_careful(dirtyRegion, &filter_then_update_rs_oop_cl, card_ptr); // If unable to process the card then we encountered an unparsable ! // part of the heap (e.g. a partially allocated object) while ! // processing a stale card. Despite the card being stale, redirty ! // and re-enqueue, because we've already cleaned the card. Without ! // this we could incorrectly discard a non-stale card. if (!card_processed) { assert(!_g1->is_gc_active(), "Unparsable heap during GC"); ! // Using invalidate for one card is simple but expensive, but this ! // should be rare; processing a stale card while a humongous ! // object is in the midst of being allocated in the same region. ! _ct_bs->invalidate(dirtyRegion); } else { _conc_refine_cards++; } // This gets set to true if the card being refined has
< prev index next >