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