diff src/share/vm/memory/cardTableModRefBS.cpp @ 940:8624da129f0b

6841313: G1: dirty cards of survivor regions in parallel Reviewed-by: tonyp, iveresov
author apetrusenko
date Mon, 31 Aug 2009 05:27:29 -0700
parents ff004bcd2596
children 6aa7255741f3
line wrap: on
line diff
--- a/src/share/vm/memory/cardTableModRefBS.cpp	Thu Aug 13 16:22:45 2009 -0700
+++ b/src/share/vm/memory/cardTableModRefBS.cpp	Mon Aug 31 05:27:29 2009 -0700
@@ -660,6 +660,29 @@
   GuaranteeNotModClosure blk(this);
   non_clean_card_iterate_work(mr, &blk, false);
 }
+
+// To verify a MemRegion is entirely dirty this closure is passed to
+// dirty_card_iterate. If the region is dirty do_MemRegion will be
+// invoked only once with a MemRegion equal to the one being
+// verified.
+class GuaranteeDirtyClosure: public MemRegionClosure {
+  CardTableModRefBS* _ct;
+  MemRegion _mr;
+  bool _result;
+public:
+  GuaranteeDirtyClosure(CardTableModRefBS* ct, MemRegion mr)
+    : _ct(ct), _mr(mr), _result(false) {}
+  void do_MemRegion(MemRegion mr) {
+    _result = _mr.equals(mr);
+  }
+  bool result() const { return _result; }
+};
+
+void CardTableModRefBS::verify_dirty_region(MemRegion mr) {
+  GuaranteeDirtyClosure blk(this, mr);
+  dirty_card_iterate(mr, &blk);
+  guarantee(blk.result(), "Non-dirty cards in region that should be dirty");
+}
 #endif
 
 bool CardTableModRefBSForCTRS::card_will_be_scanned(jbyte cv) {