< 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,143 **** 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) { if (ShenandoahLoadRefBarrier && _heap->has_forwarded_objects()) { ! return load_reference_barrier_impl(obj); } else { return obj; } } oop ShenandoahBarrierSet::load_reference_barrier(oop obj) { if (obj != NULL) { ! return load_reference_barrier_not_null(obj); } else { return obj; } } ! oop ShenandoahBarrierSet::load_reference_barrier_impl(oop obj) { 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); } else { return fwd; } } else { return obj; --- 107,168 ---- 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* load_addr) { if (ShenandoahLoadRefBarrier && _heap->has_forwarded_objects()) { ! 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, (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; } } ! 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_recursively(obj, load_addr, t); } else { return fwd; } } else { return obj;
*** 201,212 **** } else { return obj; } } ! oop fwd = load_reference_barrier_not_null(obj); if (load_addr != NULL && fwd != obj) { // Since we are here and we know the load address, update the reference. ShenandoahHeap::cas_oop(fwd, load_addr, obj); } return fwd; --- 226,238 ---- } else { return 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 >