< prev index next >

src/hotspot/share/gc/shenandoah/shenandoahMarkingContext.inline.hpp

Print this page
@@ -47,10 +47,18 @@
  
  inline bool ShenandoahMarkingContext::is_marked_weak(oop obj) const {
    return allocated_after_mark_start(obj) || _mark_bit_map.is_marked_weak(cast_from_oop<HeapWord *>(obj));
  }
  
+ inline bool ShenandoahMarkingContext::is_marked_or_old(oop obj) const {
+   return is_marked(obj) || ShenandoahHeap::heap()->is_old(obj);
+ }
+ 
+ inline bool ShenandoahMarkingContext::is_marked_strong_or_old(oop obj) const {
+   return is_marked_strong(obj) || ShenandoahHeap::heap()->is_old(obj);
+ }
+ 
  inline HeapWord* ShenandoahMarkingContext::get_next_marked_addr(HeapWord* start, HeapWord* limit) const {
    return _mark_bit_map.get_next_marked_addr(start, limit);
  }
  
  inline bool ShenandoahMarkingContext::allocated_after_mark_start(oop obj) const {

@@ -64,23 +72,42 @@
    bool alloc_after_mark_start = addr >= top_at_mark_start;
    return alloc_after_mark_start;
  }
  
  inline void ShenandoahMarkingContext::capture_top_at_mark_start(ShenandoahHeapRegion *r) {
-   size_t idx = r->index();
-   HeapWord* old_tams = _top_at_mark_starts_base[idx];
-   HeapWord* new_tams = r->top();
- 
-   assert(new_tams >= old_tams,
-          "Region " SIZE_FORMAT", TAMS updates should be monotonic: " PTR_FORMAT " -> " PTR_FORMAT,
-          idx, p2i(old_tams), p2i(new_tams));
-   assert(is_bitmap_clear_range(old_tams, new_tams),
-          "Region " SIZE_FORMAT ", bitmap should be clear while adjusting TAMS: " PTR_FORMAT " -> " PTR_FORMAT,
-          idx, p2i(old_tams), p2i(new_tams));
- 
-   _top_at_mark_starts_base[idx] = new_tams;
-   _top_bitmaps[idx] = new_tams;
+   if (r->affiliation() != FREE) {
+     size_t idx = r->index();
+     HeapWord* old_tams = _top_at_mark_starts_base[idx];
+     HeapWord* new_tams = r->top();
+ 
+     assert(new_tams >= old_tams,
+            "Region " SIZE_FORMAT", TAMS updates should be monotonic: " PTR_FORMAT " -> " PTR_FORMAT,
+            idx, p2i(old_tams), p2i(new_tams));
+     assert((new_tams == r->bottom()) || (old_tams == r->bottom()) || (new_tams >= _top_bitmaps[idx]),
+            "Region " SIZE_FORMAT", top_bitmaps updates should be monotonic: " PTR_FORMAT " -> " PTR_FORMAT,
+            idx, p2i(_top_bitmaps[idx]), p2i(new_tams));
+     assert(old_tams == r->bottom() || is_bitmap_clear_range(old_tams, new_tams),
+            "Region " SIZE_FORMAT ", bitmap should be clear while adjusting TAMS: " PTR_FORMAT " -> " PTR_FORMAT,
+            idx, p2i(old_tams), p2i(new_tams));
+ 
+     log_debug(gc)("Capturing TAMS for %s Region " SIZE_FORMAT ", was: %llx, now: %llx\n",
+                   affiliation_name(r->affiliation()), idx, (unsigned long long) old_tams, (unsigned long long) new_tams);
+ 
+     if ((old_tams == r->bottom()) && (new_tams > old_tams)) {
+       log_debug(gc)("Clearing mark bitmap for %s Region " SIZE_FORMAT " while capturing TAMS",
+                     affiliation_name(r->affiliation()), idx);
+ 
+       clear_bitmap(r);
+     }
+ 
+     _top_at_mark_starts_base[idx] = new_tams;
+     if (new_tams > r->bottom()) {
+       // In this case, new_tams is greater than old _top_bitmaps[idx]
+       _top_bitmaps[idx] = new_tams;
+     }
+   }
+   // else, FREE regions do not need their TAMS updated
  }
  
  inline void ShenandoahMarkingContext::reset_top_at_mark_start(ShenandoahHeapRegion* r) {
    _top_at_mark_starts_base[r->index()] = r->bottom();
  }
< prev index next >