< prev index next >

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

Print this page
rev 57380 : 8234974: Shenandoah: Do concurrent roots even when no evacuation is necessary
rev 57381 : [mq]: JDK-8234974-changes.patch


 247   }
 248 }
 249 
 250 oop ShenandoahBarrierSet::load_reference_barrier_native(oop obj, oop* load_addr) {
 251   return load_reference_barrier_native_impl(obj, load_addr);
 252 }
 253 
 254 oop ShenandoahBarrierSet::load_reference_barrier_native(oop obj, narrowOop* load_addr) {
 255   // Assumption: narrow oop version should not be used anywhere.
 256   ShouldNotReachHere();
 257   return NULL;
 258 }
 259 
 260 template <class T>
 261 oop ShenandoahBarrierSet::load_reference_barrier_native_impl(oop obj, T* load_addr) {
 262   if (CompressedOops::is_null(obj)) {
 263     return NULL;
 264   }
 265 
 266   ShenandoahMarkingContext* const marking_context = _heap->marking_context();
 267   if (_heap->is_evacuation_in_progress() && !marking_context->is_marked(obj)) {
 268     Thread* thr = Thread::current();
 269     if (thr->is_Java_thread()) {
 270       return NULL;
 271     } else {
 272       return obj;
 273     }
 274   }
 275 
 276   oop fwd = load_reference_barrier_not_null(obj);
 277   if (load_addr != NULL && fwd != obj) {
 278     // Since we are here and we know the load address, update the reference.
 279     ShenandoahHeap::cas_oop(fwd, load_addr, obj);
 280   }
 281 
 282   return fwd;
 283 }
 284 
 285 void ShenandoahBarrierSet::clone_barrier_runtime(oop src) {
 286   if (_heap->has_forwarded_objects()) {
 287     clone_barrier(src);


 247   }
 248 }
 249 
 250 oop ShenandoahBarrierSet::load_reference_barrier_native(oop obj, oop* load_addr) {
 251   return load_reference_barrier_native_impl(obj, load_addr);
 252 }
 253 
 254 oop ShenandoahBarrierSet::load_reference_barrier_native(oop obj, narrowOop* load_addr) {
 255   // Assumption: narrow oop version should not be used anywhere.
 256   ShouldNotReachHere();
 257   return NULL;
 258 }
 259 
 260 template <class T>
 261 oop ShenandoahBarrierSet::load_reference_barrier_native_impl(oop obj, T* load_addr) {
 262   if (CompressedOops::is_null(obj)) {
 263     return NULL;
 264   }
 265 
 266   ShenandoahMarkingContext* const marking_context = _heap->marking_context();
 267   if (_heap->is_concurrent_root_in_progress() && !marking_context->is_marked(obj)) {
 268     Thread* thr = Thread::current();
 269     if (thr->is_Java_thread()) {
 270       return NULL;
 271     } else {
 272       return obj;
 273     }
 274   }
 275 
 276   oop fwd = load_reference_barrier_not_null(obj);
 277   if (load_addr != NULL && fwd != obj) {
 278     // Since we are here and we know the load address, update the reference.
 279     ShenandoahHeap::cas_oop(fwd, load_addr, obj);
 280   }
 281 
 282   return fwd;
 283 }
 284 
 285 void ShenandoahBarrierSet::clone_barrier_runtime(oop src) {
 286   if (_heap->has_forwarded_objects()) {
 287     clone_barrier(src);
< prev index next >