< 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 >