--- a/hotspot/src/share/vm/memory/cardTableRS.cpp Tue Apr 26 11:46:34 2011 -0700
+++ b/hotspot/src/share/vm/memory/cardTableRS.cpp Tue Apr 26 21:17:24 2011 -0700
@@ -250,7 +250,34 @@
cl->gen_boundary());
ClearNoncleanCardWrapper clear_cl(dcto_cl, this);
- _ct_bs->non_clean_card_iterate_possibly_parallel(sp, sp->used_region_at_save_marks(),
+ const MemRegion urasm = sp->used_region_at_save_marks();
+#ifdef ASSERT
+ // Convert the assertion check to a warning if we are running
+ // CMS+ParNew until related bug is fixed.
+ MemRegion ur = sp->used_region();
+ assert(ur.contains(urasm) || (UseConcMarkSweepGC && UseParNewGC),
+ err_msg("Did you forget to call save_marks()? "
+ "[" PTR_FORMAT ", " PTR_FORMAT ") is not contained in "
+ "[" PTR_FORMAT ", " PTR_FORMAT ")",
+ urasm.start(), urasm.end(), ur.start(), ur.end()));
+ // In the case of CMS+ParNew, issue a warning
+ if (!ur.contains(urasm)) {
+ assert(UseConcMarkSweepGC && UseParNewGC, "Tautology: see assert above");
+ warning("CMS+ParNew: Did you forget to call save_marks()? "
+ "[" PTR_FORMAT ", " PTR_FORMAT ") is not contained in "
+ "[" PTR_FORMAT ", " PTR_FORMAT ")",
+ urasm.start(), urasm.end(), ur.start(), ur.end());
+ MemRegion ur2 = sp->used_region();
+ MemRegion urasm2 = sp->used_region_at_save_marks();
+ if (!ur.equals(ur2)) {
+ warning("CMS+ParNew: Flickering used_region()!!");
+ }
+ if (!urasm.equals(urasm2)) {
+ warning("CMS+ParNew: Flickering used_region_at_save_marks()!!");
+ }
+ }
+#endif
+ _ct_bs->non_clean_card_iterate_possibly_parallel(sp, urasm,
dcto_cl, &clear_cl);
}