< prev index next >

src/share/vm/gc/shenandoah/shenandoahHeap.inline.hpp

Print this page
rev 14453 : Remove secondary marking bitmap.

@@ -61,11 +61,11 @@
 /*
  * Marks the object. Returns true if the object has not been marked before and has
  * been marked by this thread. Returns false if the object has already been marked,
  * or if a competing thread succeeded in marking this object.
  */
-inline bool ShenandoahHeap::mark_next(oop obj) const {
+inline bool ShenandoahHeap::mark(oop obj) {
 #ifdef ASSERT
   if (! oopDesc::unsafe_equals(obj, oopDesc::bs()->read_barrier(obj))) {
     tty->print_cr("heap region containing obj:");
     ShenandoahHeapRegion* obj_region = heap_region_containing(obj);
     obj_region->print();

@@ -74,26 +74,21 @@
     forward_region->print();
   }
 #endif
 
   assert(oopDesc::unsafe_equals(obj, oopDesc::bs()->read_barrier(obj)), "only mark forwarded copy of objects");
-  return mark_next_no_checks(obj);
+  return mark_no_checks(obj);
 }
 
-inline bool ShenandoahHeap::mark_next_no_checks(oop obj) const {
+inline bool ShenandoahHeap::mark_no_checks(oop obj) {
   HeapWord* addr = (HeapWord*) obj;
-  return (! allocated_after_next_mark_start(addr)) && _next_mark_bit_map->parMark(addr);
+  return !allocated_after_mark_start(addr) && _mark_bit_map.parMark(addr);
 }
 
-inline bool ShenandoahHeap::is_marked_next(oop obj) const {
+inline bool ShenandoahHeap::is_marked(oop obj) const {
   HeapWord* addr = (HeapWord*) obj;
-  return allocated_after_next_mark_start(addr) || _next_mark_bit_map->isMarked(addr);
-}
-
-inline bool ShenandoahHeap::is_marked_complete(oop obj) const {
-  HeapWord* addr = (HeapWord*) obj;
-  return allocated_after_complete_mark_start(addr) || _complete_mark_bit_map->isMarked(addr);
+  return allocated_after_mark_start(addr) || _mark_bit_map.isMarked(addr);
 }
 
 inline bool ShenandoahHeap::need_update_refs() const {
   return _need_update_refs;
 }

@@ -426,11 +421,11 @@
   if (is_concurrent_partial_in_progress()) {
     assert(! in_collection_set((oop) entry), "must not get cset objects here");
     // assert(free_regions()->contains(heap_region_containing(entry)), "expect to-space object");
     return true;
   } else if (concurrent_mark_in_progress()) {
-    return ! is_marked_next(oop(entry));
+    return ! is_marked(oop(entry));
   } else {
     return false;
   }
 }
 

@@ -470,20 +465,13 @@
 
 inline address ShenandoahHeap::evacuation_in_progress_addr() {
   return (address) &(ShenandoahHeap::heap()->_evacuation_in_progress);
 }
 
-inline bool ShenandoahHeap::allocated_after_next_mark_start(HeapWord* addr) const {
-  uintx index = ((uintx) addr) >> ShenandoahHeapRegion::region_size_bytes_shift();
-  HeapWord* top_at_mark_start = _next_top_at_mark_starts[index];
-  bool alloc_after_mark_start = addr >= top_at_mark_start;
-  return alloc_after_mark_start;
-}
-
-inline bool ShenandoahHeap::allocated_after_complete_mark_start(HeapWord* addr) const {
+inline bool ShenandoahHeap::allocated_after_mark_start(HeapWord* addr) const {
   uintx index = ((uintx) addr) >> ShenandoahHeapRegion::region_size_bytes_shift();
-  HeapWord* top_at_mark_start = _complete_top_at_mark_starts[index];
+  HeapWord* top_at_mark_start = _top_at_mark_starts[index];
   bool alloc_after_mark_start = addr >= top_at_mark_start;
   return alloc_after_mark_start;
 }
 
 template<class T>

@@ -499,20 +487,21 @@
 template<class T>
 inline void ShenandoahHeap::marked_object_iterate(ShenandoahHeapRegion* region, T* cl, HeapWord* limit) {
   assert(BrooksPointer::word_offset() < 0, "skip_delta calculation below assumes the forwarding ptr is before obj");
 
   assert(! region->is_humongous_continuation(), "no humongous continuation regions here");
+  assert(is_bitmap_valid(), "only try this with complete marking bitmap");
 
-  MarkBitMap* mark_bit_map = _complete_mark_bit_map;
-  HeapWord* top_at_mark_start = complete_top_at_mark_start(region->bottom());
+  MarkBitMap mark_bit_map = _mark_bit_map;
+  HeapWord* tams = top_at_mark_start(region->bottom());
 
   size_t skip_bitmap_delta = BrooksPointer::word_size() + 1;
   size_t skip_objsize_delta = BrooksPointer::word_size() /* + actual obj.size() below */;
   HeapWord* start = region->bottom() + BrooksPointer::word_size();
 
-  HeapWord* end = MIN2(top_at_mark_start + BrooksPointer::word_size(), region->end());
-  HeapWord* addr = mark_bit_map->getNextMarkedWordAddress(start, end);
+  HeapWord* end = MIN2(tams + BrooksPointer::word_size(), region->end());
+  HeapWord* addr = mark_bit_map.getNextMarkedWordAddress(start, end);
 
   intx dist = ShenandoahMarkScanPrefetch;
   if (dist > 0) {
     // Batched scan that prefetches the oop data, anticipating the access to
     // either header, oop field, or forwarding pointer. Not that we cannot

@@ -535,53 +524,52 @@
       avail = 0;
       for (int c = 0; (c < dist) && (addr < limit); c++) {
         Prefetch::read(addr, BrooksPointer::byte_offset());
         oop obj = oop(addr);
         slots[avail++] = obj;
-        if (addr < top_at_mark_start) {
+        if (addr < tams) {
           addr += skip_bitmap_delta;
-          addr = mark_bit_map->getNextMarkedWordAddress(addr, end);
+          addr = mark_bit_map.getNextMarkedWordAddress(addr, end);
         } else {
           // cannot trust mark bitmap anymore, finish the current stride,
           // and switch to accurate traversal
           addr += obj->size() + skip_objsize_delta;
           aborting = true;
         }
       }
 
       for (int c = 0; c < avail; c++) {
-        do_marked_object(mark_bit_map, cl, slots[c]);
+        do_marked_object(cl, slots[c]);
       }
     } while (avail > 0 && !aborting);
 
     // accurate traversal
     while (addr < limit) {
       oop obj = oop(addr);
       int size = obj->size();
-      do_marked_object(mark_bit_map, cl, obj);
+      do_marked_object(cl, obj);
       addr += size + skip_objsize_delta;
     }
   } else {
     while (addr < limit) {
       oop obj = oop(addr);
       int size = obj->size();
-      do_marked_object(mark_bit_map, cl, obj);
+      do_marked_object(cl, obj);
       addr += size + skip_objsize_delta;
-      if (addr < top_at_mark_start) {
-        addr = mark_bit_map->getNextMarkedWordAddress(addr, end);
+      if (addr < tams) {
+        addr = mark_bit_map.getNextMarkedWordAddress(addr, end);
       }
     }
   }
 }
 
 template<class T>
-inline void ShenandoahHeap::do_marked_object(MarkBitMap* bitmap, T* cl, oop obj) {
+inline void ShenandoahHeap::do_marked_object(T* cl, oop obj) {
   assert(!oopDesc::is_null(obj), "sanity");
   assert(oopDesc::is_oop(obj), "sanity");
   assert(is_in(obj), "sanity");
-  assert(bitmap == _complete_mark_bit_map, "only iterate completed mark bitmap");
-  assert(is_marked_complete(obj), "object expected to be marked");
+  assert(is_marked(obj), "object expected to be marked");
   cl->do_object(obj);
 }
 
 template <class T>
 class ShenandoahObjectToOopClosure : public ObjectClosure {
< prev index next >