src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp
changeset 58693 3f35a9efd7de
parent 58674 42a3a8941418
child 58710 ff3eab78554f
equal deleted inserted replaced
58692:04946947ca79 58693:3f35a9efd7de
   260       gclab->retire();
   260       gclab->retire();
   261     }
   261     }
   262   }
   262   }
   263 }
   263 }
   264 
   264 
   265 oop ShenandoahBarrierSet::oop_load_from_native_barrier(oop obj) {
   265 oop ShenandoahBarrierSet::oop_load_from_native_barrier(oop obj, oop* load_addr) {
   266   if (CompressedOops::is_null(obj)) {
   266   if (CompressedOops::is_null(obj)) {
   267     return NULL;
   267     return NULL;
   268   }
   268   }
   269 
   269 
   270   ShenandoahMarkingContext* const marking_context = _heap->marking_context();
   270   ShenandoahMarkingContext* const marking_context = _heap->marking_context();
   275     } else {
   275     } else {
   276       return obj;
   276       return obj;
   277     }
   277     }
   278   }
   278   }
   279 
   279 
   280   return load_reference_barrier_not_null(obj);
   280   oop fwd = load_reference_barrier_not_null(obj);
       
   281   if (load_addr != NULL && fwd != obj) {
       
   282     // Since we are here and we know the load address, update the reference.
       
   283     ShenandoahHeap::cas_oop(fwd, load_addr, obj);
       
   284   }
       
   285 
       
   286   return fwd;
   281 }
   287 }
   282 
   288 
   283 void ShenandoahBarrierSet::clone_barrier_runtime(oop src) {
   289 void ShenandoahBarrierSet::clone_barrier_runtime(oop src) {
   284   if (_heap->has_forwarded_objects()) {
   290   if (_heap->has_forwarded_objects()) {
   285     clone_barrier(src);
   291     clone_barrier(src);