--- old/src/hotspot/share/gc/shared/cardTableRS.cpp 2018-04-06 10:58:39.468574631 +0200 +++ new/src/hotspot/share/gc/shared/cardTableRS.cpp 2018-04-06 10:58:39.240574639 +0200 @@ -279,36 +279,24 @@ void CardTableRS::younger_refs_in_space_iterate(Space* sp, OopsInGenClosure* cl, uint n_threads) { + verify_used_region_at_save_marks(sp); + const MemRegion urasm = sp->used_region_at_save_marks(); + non_clean_card_iterate_possibly_parallel(sp, urasm, cl, this, n_threads); +} + #ifdef ASSERT - // Convert the assertion check to a warning if we are running - // CMS+ParNew until related bug is fixed. +void CardTableRS::verify_used_region_at_save_marks(Space* sp) const { MemRegion ur = sp->used_region(); - assert(ur.contains(urasm) || (UseConcMarkSweepGC), + MemRegion urasm = sp->used_region_at_save_marks(); + + assert(ur.contains(urasm), "Did you forget to call save_marks()? " "[" PTR_FORMAT ", " PTR_FORMAT ") is not contained in " "[" PTR_FORMAT ", " PTR_FORMAT ")", p2i(urasm.start()), p2i(urasm.end()), p2i(ur.start()), p2i(ur.end())); - // In the case of CMS+ParNew, issue a warning - if (!ur.contains(urasm)) { - assert(UseConcMarkSweepGC, "Tautology: see assert above"); - log_warning(gc)("CMS+ParNew: Did you forget to call save_marks()? " - "[" PTR_FORMAT ", " PTR_FORMAT ") is not contained in " - "[" PTR_FORMAT ", " PTR_FORMAT ")", - p2i(urasm.start()), p2i(urasm.end()), p2i(ur.start()), p2i(ur.end())); - MemRegion ur2 = sp->used_region(); - MemRegion urasm2 = sp->used_region_at_save_marks(); - if (!ur.equals(ur2)) { - log_warning(gc)("CMS+ParNew: Flickering used_region()!!"); - } - if (!urasm.equals(urasm2)) { - log_warning(gc)("CMS+ParNew: Flickering used_region_at_save_marks()!!"); - } - ShouldNotReachHere(); - } -#endif - non_clean_card_iterate_possibly_parallel(sp, urasm, cl, this, n_threads); } +#endif void CardTableRS::clear_into_younger(Generation* old_gen) { assert(GenCollectedHeap::heap()->is_old_gen(old_gen), @@ -611,8 +599,8 @@ CardTable::verify(); } -CardTableRS::CardTableRS(MemRegion whole_heap) : - CardTable(whole_heap, /* scanned concurrently */ UseConcMarkSweepGC && CMSPrecleaningEnabled), +CardTableRS::CardTableRS(MemRegion whole_heap, bool scanned_concurrently) : + CardTable(whole_heap, scanned_concurrently), _cur_youngergen_card_val(youngergenP1_card), // LNC functionality _lowest_non_clean(NULL), @@ -698,11 +686,7 @@ { if (!mr.is_empty()) { if (n_threads > 0) { -#if INCLUDE_ALL_GCS non_clean_card_iterate_parallel_work(sp, mr, cl, ct, n_threads); -#else // INCLUDE_ALL_GCS - fatal("Parallel gc not supported here."); -#endif // INCLUDE_ALL_GCS } else { // clear_cl finds contiguous dirty ranges of cards to process and clear. @@ -717,6 +701,12 @@ } } +void CardTableRS::non_clean_card_iterate_parallel_work(Space* sp, MemRegion mr, + OopsInGenClosure* cl, CardTableRS* ct, + uint n_threads) { + fatal("Parallel gc not supported here."); +} + bool CardTableRS::is_in_young(oop obj) const { return GenCollectedHeap::heap()->is_in_young(obj); }