< prev index next >

src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp

Print this page
rev 59271 : 8240870: Shenandoah: merge evac and update phases
Reviewed-by: XXX

@@ -107,37 +107,62 @@
   bool unknown = (decorators & ON_UNKNOWN_OOP_REF) != 0;
   bool on_weak_ref = (decorators & (ON_WEAK_OOP_REF | ON_PHANTOM_OOP_REF)) != 0;
   return (on_weak_ref || unknown) && keep_alive;
 }
 
-oop ShenandoahBarrierSet::load_reference_barrier_not_null(oop obj) {
+oop ShenandoahBarrierSet::load_reference_barrier_not_null(oop obj, oop* load_addr) {
   if (ShenandoahLoadRefBarrier && _heap->has_forwarded_objects()) {
-    return load_reference_barrier_impl(obj);
+    return load_reference_barrier_impl(obj, load_addr);
+  } else {
+    return obj;
+  }
+}
+
+oop ShenandoahBarrierSet::load_reference_barrier_not_null(oop obj, narrowOop* load_addr) {
+  if (ShenandoahLoadRefBarrier && _heap->has_forwarded_objects()) {
+    return load_reference_barrier_impl(obj, load_addr);
   } else {
     return obj;
   }
 }
 
 oop ShenandoahBarrierSet::load_reference_barrier(oop obj) {
   if (obj != NULL) {
-    return load_reference_barrier_not_null(obj);
+    return load_reference_barrier_not_null(obj, (oop*)NULL);
+  } else {
+    return obj;
+  }
+}
+
+oop ShenandoahBarrierSet::load_reference_barrier(oop obj, oop* load_addr) {
+  if (obj != NULL) {
+    return load_reference_barrier_not_null(obj, load_addr);
+  } else {
+    return obj;
+  }
+}
+
+oop ShenandoahBarrierSet::load_reference_barrier(oop obj, narrowOop* load_addr) {
+  if (obj != NULL) {
+    return load_reference_barrier_not_null(obj, load_addr);
   } else {
     return obj;
   }
 }
 
-oop ShenandoahBarrierSet::load_reference_barrier_impl(oop obj) {
+template<class T>
+oop ShenandoahBarrierSet::load_reference_barrier_impl(oop obj, T* load_addr) {
   assert(ShenandoahLoadRefBarrier, "should be enabled");
   if (!CompressedOops::is_null(obj)) {
     bool evac_in_progress = _heap->is_evacuation_in_progress();
     oop fwd = resolve_forwarded_not_null(obj);
     if (evac_in_progress &&
         _heap->in_collection_set(obj) &&
         obj == fwd) {
       Thread *t = Thread::current();
       ShenandoahEvacOOMScope oom_evac_scope;
-      return _heap->evacuate_object(obj, t);
+      return _heap->evacuate_object_recursively(obj, load_addr, t);
     } else {
       return fwd;
     }
   } else {
     return obj;

@@ -201,12 +226,13 @@
     } else {
       return obj;
     }
   }
 
-  oop fwd = load_reference_barrier_not_null(obj);
+  oop fwd = load_reference_barrier_not_null(obj, load_addr);
   if (load_addr != NULL && fwd != obj) {
+    // TODO: superfluous here? LRB updates it for us.
     // Since we are here and we know the load address, update the reference.
     ShenandoahHeap::cas_oop(fwd, load_addr, obj);
   }
 
   return fwd;
< prev index next >