Skip to content
This repository has been archived by the owner on Aug 27, 2022. It is now read-only.

Commit

Permalink
8242301: Shenandoah: Inline LRB runtime call
Browse files Browse the repository at this point in the history
Reviewed-by: zgu
  • Loading branch information
rkennke committed Apr 7, 2020
1 parent 7ac64b8 commit 2b42382
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 33 deletions.
29 changes: 0 additions & 29 deletions src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp
Expand Up @@ -125,35 +125,6 @@ oop ShenandoahBarrierSet::load_reference_barrier(oop obj) {
} }
} }


oop ShenandoahBarrierSet::load_reference_barrier_mutator(oop obj, oop* load_addr) {
return load_reference_barrier_mutator_work(obj, load_addr);
}

oop ShenandoahBarrierSet::load_reference_barrier_mutator(oop obj, narrowOop* load_addr) {
return load_reference_barrier_mutator_work(obj, load_addr);
}

template <class T>
oop ShenandoahBarrierSet::load_reference_barrier_mutator_work(oop obj, T* load_addr) {
assert(ShenandoahLoadRefBarrier, "should be enabled");
shenandoah_assert_in_cset(load_addr, obj);

oop fwd = resolve_forwarded_not_null_mutator(obj);
if (obj == fwd) {
assert(_heap->is_evacuation_in_progress(),
"evac should be in progress");
ShenandoahEvacOOMScope scope;
fwd = _heap->evacuate_object(obj, Thread::current());
}

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

oop ShenandoahBarrierSet::load_reference_barrier_impl(oop obj) { oop ShenandoahBarrierSet::load_reference_barrier_impl(oop obj) {
assert(ShenandoahLoadRefBarrier, "should be enabled"); assert(ShenandoahLoadRefBarrier, "should be enabled");
if (!CompressedOops::is_null(obj)) { if (!CompressedOops::is_null(obj)) {
Expand Down
5 changes: 1 addition & 4 deletions src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.hpp
Expand Up @@ -96,11 +96,8 @@ class ShenandoahBarrierSet: public BarrierSet {
oop load_reference_barrier(oop obj); oop load_reference_barrier(oop obj);
oop load_reference_barrier_not_null(oop obj); oop load_reference_barrier_not_null(oop obj);


oop load_reference_barrier_mutator(oop obj, oop* load_addr);
oop load_reference_barrier_mutator(oop obj, narrowOop* load_addr);

template <class T> template <class T>
oop load_reference_barrier_mutator_work(oop obj, T* load_addr); inline oop load_reference_barrier_mutator(oop obj, T* load_addr);


oop load_reference_barrier_native(oop obj, oop* load_addr); oop load_reference_barrier_native(oop obj, oop* load_addr);
oop load_reference_barrier_native(oop obj, narrowOop* load_addr); oop load_reference_barrier_native(oop obj, narrowOop* load_addr);
Expand Down
21 changes: 21 additions & 0 deletions src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.inline.hpp
Expand Up @@ -53,6 +53,27 @@ inline oop ShenandoahBarrierSet::resolve_forwarded_not_null_mutator(oop p) {
return ShenandoahForwarding::get_forwardee_mutator(p); return ShenandoahForwarding::get_forwardee_mutator(p);
} }


template <class T>
inline oop ShenandoahBarrierSet::load_reference_barrier_mutator(oop obj, T* load_addr) {
assert(ShenandoahLoadRefBarrier, "should be enabled");
shenandoah_assert_in_cset(load_addr, obj);

oop fwd = resolve_forwarded_not_null_mutator(obj);
if (obj == fwd) {
assert(_heap->is_evacuation_in_progress(),
"evac should be in progress");
ShenandoahEvacOOMScope scope;
fwd = _heap->evacuate_object(obj, Thread::current());
}

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

inline void ShenandoahBarrierSet::enqueue(oop obj) { inline void ShenandoahBarrierSet::enqueue(oop obj) {
assert(_satb_mark_queue_set.is_active(), "only get here when SATB active"); assert(_satb_mark_queue_set.is_active(), "only get here when SATB active");


Expand Down

0 comments on commit 2b42382

Please sign in to comment.