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