< prev index next >

src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.inline.hpp

Print this page
rev 57589 : 8237632: Shenandoah fails some vmTestbase_nsk_jvmti tests with "Forwardee must point to a heap address"

*** 30,44 **** --- 30,48 ---- #include "gc/shenandoah/shenandoahCollectionSet.inline.hpp" #include "gc/shenandoah/shenandoahForwarding.inline.hpp" #include "gc/shenandoah/shenandoahHeap.inline.hpp" #include "gc/shenandoah/shenandoahHeapRegion.hpp" #include "gc/shenandoah/shenandoahMarkingContext.inline.hpp" + #include "gc/shenandoah/shenandoahSafepoint.hpp" #include "gc/shenandoah/shenandoahThreadLocalData.hpp" #include "memory/iterator.inline.hpp" #include "oops/oop.inline.hpp" inline oop ShenandoahBarrierSet::resolve_forwarded_not_null(oop p) { + assert(ShenandoahHeap::heap()->in_collection_set(p) || + ShenandoahSafepoint::is_at_shenandoah_safepoint(), + "No forwarding oops outside cset"); return ShenandoahForwarding::get_forwardee(p); } inline oop ShenandoahBarrierSet::resolve_forwarded(oop p) { if (((HeapWord*) p) != NULL) {
*** 46,55 **** --- 50,70 ---- } else { return p; } } + inline oop ShenandoahBarrierSet::resolve_forwarded_checked(oop p) { + if (p == NULL) return p; + ShenandoahHeap* const heap = ShenandoahHeap::heap(); + if (heap->in_collection_set(p) || + (heap->is_concurrent_traversal_in_progress() && heap->is_degenerated_gc_in_progress())) { + return resolve_forwarded_not_null(p); + } else { + return p; + } + } + inline void ShenandoahBarrierSet::enqueue(oop obj) { shenandoah_assert_not_forwarded_if(NULL, obj, _heap->is_concurrent_traversal_in_progress()); assert(_satb_mark_queue_set.is_active(), "only get here when SATB active"); // Filter marked objects before hitting the SATB queues. The same predicate would
*** 117,128 **** --- 132,145 ---- inline oop ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_load_not_in_heap(T* addr) { oop value = Raw::oop_load_not_in_heap(addr); if (value != NULL) { ShenandoahBarrierSet *const bs = ShenandoahBarrierSet::barrier_set(); value = bs->load_reference_barrier_native(value, addr); + if (value != NULL) { bs->keep_alive_if_weak<decorators>(value); } + } return value; } template <DecoratorSet decorators, typename BarrierSetT> template <typename T>
*** 183,193 **** oop expected = compare_value; do { compare_value = expected; res = Raw::oop_atomic_cmpxchg(addr, compare_value, new_value); expected = res; ! } while ((compare_value != expected) && (resolve_forwarded(compare_value) == resolve_forwarded(expected))); // Note: We don't need a keep-alive-barrier here. We already enqueue any loaded reference for SATB anyway, // because it must be the previous value. if (res != NULL) { res = ShenandoahBarrierSet::barrier_set()->load_reference_barrier_not_null(res); --- 200,210 ---- oop expected = compare_value; do { compare_value = expected; res = Raw::oop_atomic_cmpxchg(addr, compare_value, new_value); expected = res; ! } while ((compare_value != expected) && (resolve_forwarded_checked(compare_value) == resolve_forwarded_checked(expected))); // Note: We don't need a keep-alive-barrier here. We already enqueue any loaded reference for SATB anyway, // because it must be the previous value. if (res != NULL) { res = ShenandoahBarrierSet::barrier_set()->load_reference_barrier_not_null(res);
< prev index next >