< prev index next >
src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp
Print this page
rev 54386 : 8221766: Load-reference barriers for Shenandoah
*** 216,250 ****
ShenandoahUpdateRefsForOopClosure</* wb = */ false> cl;
obj->oop_iterate(&cl);
}
}
! oop ShenandoahBarrierSet::read_barrier(oop src) {
! // Check for forwarded objects, because on Full GC path we might deal with
! // non-trivial fwdptrs that contain Full GC specific metadata. We could check
! // for is_full_gc_in_progress(), but this also covers the case of stable heap,
! // which provides a bit of performance improvement.
! if (ShenandoahReadBarrier && _heap->has_forwarded_objects()) {
! return ShenandoahBarrierSet::resolve_forwarded(src);
} else {
! return src;
}
}
! bool ShenandoahBarrierSet::obj_equals(oop obj1, oop obj2) {
! bool eq = oopDesc::equals_raw(obj1, obj2);
! if (! eq && ShenandoahAcmpBarrier) {
! OrderAccess::loadload();
! obj1 = resolve_forwarded(obj1);
! obj2 = resolve_forwarded(obj2);
! eq = oopDesc::equals_raw(obj1, obj2);
}
- return eq;
}
! oop ShenandoahBarrierSet::write_barrier_mutator(oop obj) {
! assert(UseShenandoahGC && ShenandoahWriteBarrier, "should be enabled");
assert(_heap->is_gc_in_progress_mask(ShenandoahHeap::EVACUATION | ShenandoahHeap::TRAVERSAL), "evac should be in progress");
shenandoah_assert_in_cset(NULL, obj);
oop fwd = resolve_forwarded_not_null(obj);
if (oopDesc::equals_raw(obj, fwd)) {
--- 216,244 ----
ShenandoahUpdateRefsForOopClosure</* wb = */ false> cl;
obj->oop_iterate(&cl);
}
}
! 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_mutator(oop obj) {
! assert(ShenandoahLoadRefBarrier, "should be enabled");
assert(_heap->is_gc_in_progress_mask(ShenandoahHeap::EVACUATION | ShenandoahHeap::TRAVERSAL), "evac should be in progress");
shenandoah_assert_in_cset(NULL, obj);
oop fwd = resolve_forwarded_not_null(obj);
if (oopDesc::equals_raw(obj, fwd)) {
*** 286,297 ****
return res_oop;
}
return fwd;
}
! oop ShenandoahBarrierSet::write_barrier_impl(oop obj) {
! assert(UseShenandoahGC && ShenandoahWriteBarrier, "should be enabled");
if (!CompressedOops::is_null(obj)) {
bool evac_in_progress = _heap->is_gc_in_progress_mask(ShenandoahHeap::EVACUATION | ShenandoahHeap::TRAVERSAL);
oop fwd = resolve_forwarded_not_null(obj);
if (evac_in_progress &&
_heap->in_collection_set(obj) &&
--- 280,291 ----
return res_oop;
}
return fwd;
}
! oop ShenandoahBarrierSet::load_reference_barrier_impl(oop obj) {
! assert(ShenandoahLoadRefBarrier, "should be enabled");
if (!CompressedOops::is_null(obj)) {
bool evac_in_progress = _heap->is_gc_in_progress_mask(ShenandoahHeap::EVACUATION | ShenandoahHeap::TRAVERSAL);
oop fwd = resolve_forwarded_not_null(obj);
if (evac_in_progress &&
_heap->in_collection_set(obj) &&
*** 309,335 ****
} else {
return obj;
}
}
! oop ShenandoahBarrierSet::write_barrier(oop obj) {
! if (ShenandoahWriteBarrier && _heap->has_forwarded_objects()) {
! return write_barrier_impl(obj);
! } else {
! return obj;
! }
! }
!
! oop ShenandoahBarrierSet::storeval_barrier(oop obj) {
if (ShenandoahStoreValEnqueueBarrier && !CompressedOops::is_null(obj) && _heap->is_concurrent_traversal_in_progress()) {
- obj = write_barrier(obj);
enqueue(obj);
}
- if (ShenandoahStoreValReadBarrier) {
- obj = resolve_forwarded(obj);
- }
- return obj;
}
void ShenandoahBarrierSet::keep_alive_barrier(oop obj) {
if (ShenandoahKeepAliveBarrier && _heap->is_concurrent_mark_in_progress()) {
enqueue(obj);
--- 303,316 ----
} else {
return obj;
}
}
! void ShenandoahBarrierSet::storeval_barrier(oop obj) {
if (ShenandoahStoreValEnqueueBarrier && !CompressedOops::is_null(obj) && _heap->is_concurrent_traversal_in_progress()) {
enqueue(obj);
}
}
void ShenandoahBarrierSet::keep_alive_barrier(oop obj) {
if (ShenandoahKeepAliveBarrier && _heap->is_concurrent_mark_in_progress()) {
enqueue(obj);
< prev index next >