hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp
changeset 13728 882756847a04
parent 13336 e582172ff6ff
child 13752 92f03fcf979a
--- a/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp	Fri Aug 31 16:39:35 2012 -0700
+++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp	Sat Sep 01 13:25:18 2012 -0400
@@ -315,9 +315,7 @@
 }
 
 bool ConcurrentMark::not_yet_marked(oop obj) const {
-  return (_g1h->is_obj_ill(obj)
-          || (_g1h->is_in_permanent(obj)
-              && !nextMarkBitMap()->isMarked((HeapWord*)obj)));
+  return _g1h->is_obj_ill(obj);
 }
 
 CMRootRegions::CMRootRegions() :
@@ -1207,7 +1205,8 @@
     } else {
       assert(last_idx < _card_bm->size(), "sanity");
       // Note BitMap::par_at_put_range() is exclusive.
-      _card_bm->par_at_put_range(start_idx, last_idx+1, true);
+      BitMap::idx_t max_idx = MAX2(last_idx+1, _card_bm->size());
+      _card_bm->par_at_put_range(start_idx, max_idx, true);
     }
   }
 
@@ -1553,8 +1552,21 @@
 
     // Now set the bits for [ntams, top]
     BitMap::idx_t start_idx = _cm->card_bitmap_index_for(ntams);
-    BitMap::idx_t last_idx = _cm->card_bitmap_index_for(top);
+    // set_card_bitmap_range() expects the last_idx to be with
+    // the range of the bit map (see assertion in set_card_bitmap_range()),
+    // so limit it to that range with this application of MIN2.
+    BitMap::idx_t last_idx = MIN2(_cm->card_bitmap_index_for(top),
+                                  _card_bm->size()-1);
+    if (start_idx < _card_bm->size()) {
     set_card_bitmap_range(start_idx, last_idx);
+    } else {
+      // To reach here start_idx must be beyond the end of
+      // the bit map and last_idx must have been limited by
+      // the MIN2().
+      assert(start_idx == last_idx + 1,
+        err_msg("Not beyond end start_idx " SIZE_FORMAT " last_idx "
+                SIZE_FORMAT, start_idx, last_idx));
+    }
 
     // Set the bit for the region if it contains live data
     if (hr->next_marked_bytes() > 0) {
@@ -2011,7 +2023,7 @@
          (!_g1->is_in_g1_reserved(addr) || !_g1->is_obj_ill(obj));
 }
 
-class G1CMKeepAliveClosure: public OopClosure {
+class G1CMKeepAliveClosure: public ExtendedOopClosure {
   G1CollectedHeap* _g1;
   ConcurrentMark*  _cm;
  public:
@@ -2052,7 +2064,7 @@
     _oopClosure(oopClosure) { }
 
   void do_void() {
-    _markStack->drain((OopClosure*)_oopClosure, _cm->nextMarkBitMap(), false);
+    _markStack->drain(_oopClosure, _cm->nextMarkBitMap(), false);
   }
 };
 
@@ -2494,7 +2506,7 @@
       _out->print_cr(" "PTR_FORMAT"%s",
                      o, (over_tams) ? " >" : (marked) ? " M" : "");
       PrintReachableOopClosure oopCl(_out, _vo, _all);
-      o->oop_iterate(&oopCl);
+      o->oop_iterate_no_header(&oopCl);
     }
   }
 };