< prev index next >

src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp

Print this page
rev 56289 : 8231086: Shenandoah: Stronger invariant for object-arraycopy

*** 39,75 **** #endif class ShenandoahBarrierSetC1; class ShenandoahBarrierSetC2; - template <bool STOREVAL_EVAC_BARRIER> - class ShenandoahUpdateRefsForOopClosure: public BasicOopIterateClosure { - private: - ShenandoahHeap* _heap; - ShenandoahBarrierSet* _bs; - - template <class T> - inline void do_oop_work(T* p) { - oop o; - if (STOREVAL_EVAC_BARRIER) { - o = _heap->evac_update_with_forwarded(p); - if (!CompressedOops::is_null(o)) { - _bs->enqueue(o); - } - } else { - _heap->maybe_update_with_forwarded(p); - } - } - public: - ShenandoahUpdateRefsForOopClosure() : _heap(ShenandoahHeap::heap()), _bs(ShenandoahBarrierSet::barrier_set()) { - assert(UseShenandoahGC && ShenandoahCloneBarrier, "should be enabled"); - } - - virtual void do_oop(oop* p) { do_oop_work(p); } - virtual void do_oop(narrowOop* p) { do_oop_work(p); } - }; - ShenandoahBarrierSet::ShenandoahBarrierSet(ShenandoahHeap* heap) : BarrierSet(make_barrier_set_assembler<ShenandoahBarrierSetAssembler>(), make_barrier_set_c1<ShenandoahBarrierSetC1>(), make_barrier_set_c2<ShenandoahBarrierSetC2>(), NULL /* barrier_set_nmethod */, --- 39,48 ----
*** 95,171 **** bool ShenandoahBarrierSet::is_aligned(HeapWord* hw) { return true; } - template <class T, bool STOREVAL_EVAC_BARRIER> - void ShenandoahBarrierSet::write_ref_array_loop(HeapWord* start, size_t count) { - assert(UseShenandoahGC && ShenandoahCloneBarrier, "should be enabled"); - ShenandoahUpdateRefsForOopClosure<STOREVAL_EVAC_BARRIER> cl; - T* dst = (T*) start; - for (size_t i = 0; i < count; i++) { - cl.do_oop(dst++); - } - } - - void ShenandoahBarrierSet::write_ref_array(HeapWord* start, size_t count) { - assert(_heap->is_update_refs_in_progress(), "should not be here otherwise"); - assert(count > 0, "Should have been filtered before"); - - if (_heap->is_concurrent_traversal_in_progress()) { - ShenandoahEvacOOMScope oom_evac_scope; - if (UseCompressedOops) { - write_ref_array_loop<narrowOop, /* evac = */ true>(start, count); - } else { - write_ref_array_loop<oop, /* evac = */ true>(start, count); - } - } else { - if (UseCompressedOops) { - write_ref_array_loop<narrowOop, /* evac = */ false>(start, count); - } else { - write_ref_array_loop<oop, /* evac = */ false>(start, count); - } - } - } - - template <class T> - void ShenandoahBarrierSet::write_ref_array_pre_work(T* dst, size_t count) { - shenandoah_assert_not_in_cset_loc_except(dst, _heap->cancelled_gc()); - assert(ShenandoahThreadLocalData::satb_mark_queue(Thread::current()).is_active(), "Shouldn't be here otherwise"); - assert(ShenandoahSATBBarrier, "Shouldn't be here otherwise"); - assert(count > 0, "Should have been filtered before"); - - Thread* thread = Thread::current(); - ShenandoahMarkingContext* ctx = _heap->marking_context(); - bool has_forwarded = _heap->has_forwarded_objects(); - T* elem_ptr = dst; - for (size_t i = 0; i < count; i++, elem_ptr++) { - T heap_oop = RawAccess<>::oop_load(elem_ptr); - if (!CompressedOops::is_null(heap_oop)) { - oop obj = CompressedOops::decode_not_null(heap_oop); - if (has_forwarded) { - obj = resolve_forwarded_not_null(obj); - } - if (!ctx->is_marked(obj)) { - ShenandoahThreadLocalData::satb_mark_queue(thread).enqueue_known_active(obj); - } - } - } - } - - void ShenandoahBarrierSet::write_ref_array_pre(oop* dst, size_t count, bool dest_uninitialized) { - if (! dest_uninitialized) { - write_ref_array_pre_work(dst, count); - } - } - - void ShenandoahBarrierSet::write_ref_array_pre(narrowOop* dst, size_t count, bool dest_uninitialized) { - if (! dest_uninitialized) { - write_ref_array_pre_work(dst, count); - } - } - template <class T> inline void ShenandoahBarrierSet::inline_write_ref_field_pre(T* field, oop new_val) { shenandoah_assert_not_in_cset_loc_except(field, _heap->cancelled_gc()); if (_heap->is_concurrent_mark_in_progress()) { T heap_oop = RawAccess<>::oop_load(field); --- 68,77 ----
*** 192,222 **** shenandoah_assert_not_in_cset_loc_except(v, _heap->cancelled_gc()); shenandoah_assert_not_forwarded_except (v, o, o == NULL || _heap->cancelled_gc() || !_heap->is_concurrent_mark_in_progress()); shenandoah_assert_not_in_cset_except (v, o, o == NULL || _heap->cancelled_gc() || !_heap->is_concurrent_mark_in_progress()); } - void ShenandoahBarrierSet::write_region(MemRegion mr) { - if (!ShenandoahCloneBarrier) return; - if (!_heap->is_update_refs_in_progress()) return; - - // This is called for cloning an object (see jvm.cpp) after the clone - // has been made. We are not interested in any 'previous value' because - // it would be NULL in any case. But we *are* interested in any oop* - // that potentially need to be updated. - - oop obj = oop(mr.start()); - shenandoah_assert_correct(NULL, obj); - if (_heap->is_concurrent_traversal_in_progress()) { - ShenandoahEvacOOMScope oom_evac_scope; - ShenandoahUpdateRefsForOopClosure</* evac = */ true> cl; - obj->oop_iterate(&cl); - } else { - ShenandoahUpdateRefsForOopClosure</* evac = */ 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; --- 98,107 ----
< prev index next >