< prev index next >

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

Print this page
rev 57746 : 8240873: Shenandoah: Short-cut arraycopy barriers
Reviewed-by: shade


 276     if (!CompressedOops::is_null(o)) {
 277       oop obj = CompressedOops::decode_not_null(o);
 278       if (HAS_FWD && cset->is_in(obj)) {
 279         oop fwd = resolve_forwarded_not_null(obj);
 280         if (EVAC && obj == fwd) {
 281           fwd = _heap->evacuate_object(obj, thread);
 282         }
 283         assert(obj != fwd || _heap->cancelled_gc(), "must be forwarded");
 284         oop witness = ShenandoahHeap::cas_oop(fwd, elem_ptr, o);
 285         obj = fwd;
 286       }
 287       if (ENQUEUE && !ctx->is_marked(obj)) {
 288         queue.enqueue_known_active(obj);
 289       }
 290     }
 291   }
 292 }
 293 
 294 template <class T>
 295 void ShenandoahBarrierSet::arraycopy_pre_work(T* src, T* dst, size_t count) {
 296   if (_heap->is_concurrent_mark_in_progress()) {

 297     arraycopy_work<T, false, false, true>(dst, count);
 298   }
 299 

 300   arraycopy_update_impl(src, count);

 301 }
 302 
 303 void ShenandoahBarrierSet::arraycopy_pre(oop* src, oop* dst, size_t count) {
 304   arraycopy_pre_work(src, dst, count);
 305 }
 306 
 307 void ShenandoahBarrierSet::arraycopy_pre(narrowOop* src, narrowOop* dst, size_t count) {
 308   arraycopy_pre_work(src, dst, count);
 309 }
 310 




 311 template <class T>
 312 void ShenandoahBarrierSet::arraycopy_update_impl(T* src, size_t count) {

 313   if (_heap->is_evacuation_in_progress()) {
 314     ShenandoahEvacOOMScope oom_evac;
 315     arraycopy_work<T, true, true, false>(src, count);
 316   } else if (_heap->is_concurrent_traversal_in_progress()){
 317     ShenandoahEvacOOMScope oom_evac;
 318     arraycopy_work<T, true, true, true>(src, count);
 319   } else if (_heap->has_forwarded_objects()) {
 320     arraycopy_work<T, true, false, false>(src, count);
 321   }
 322 }
 323 
 324 void ShenandoahBarrierSet::arraycopy_update(oop* src, size_t count) {
 325   arraycopy_update_impl(src, count);
 326 }
 327 
 328 void ShenandoahBarrierSet::arraycopy_update(narrowOop* src, size_t count) {
 329   arraycopy_update_impl(src, count);
 330 }
 331 
 332 #endif // SHARE_GC_SHENANDOAH_SHENANDOAHBARRIERSET_INLINE_HPP


 276     if (!CompressedOops::is_null(o)) {
 277       oop obj = CompressedOops::decode_not_null(o);
 278       if (HAS_FWD && cset->is_in(obj)) {
 279         oop fwd = resolve_forwarded_not_null(obj);
 280         if (EVAC && obj == fwd) {
 281           fwd = _heap->evacuate_object(obj, thread);
 282         }
 283         assert(obj != fwd || _heap->cancelled_gc(), "must be forwarded");
 284         oop witness = ShenandoahHeap::cas_oop(fwd, elem_ptr, o);
 285         obj = fwd;
 286       }
 287       if (ENQUEUE && !ctx->is_marked(obj)) {
 288         queue.enqueue_known_active(obj);
 289       }
 290     }
 291   }
 292 }
 293 
 294 template <class T>
 295 void ShenandoahBarrierSet::arraycopy_pre_work(T* src, T* dst, size_t count) {
 296   if (_heap->is_concurrent_mark_in_progress() &&
 297       !_heap->marking_context()->allocated_after_mark_start(reinterpret_cast<HeapWord*>(dst))) {
 298     arraycopy_work<T, false, false, true>(dst, count);
 299   }
 300 
 301   if (_heap->has_forwarded_objects()) {
 302     arraycopy_update_impl(src, count);
 303   }
 304 }
 305 
 306 void ShenandoahBarrierSet::arraycopy_pre(oop* src, oop* dst, size_t count) {
 307   arraycopy_pre_work(src, dst, count);
 308 }
 309 
 310 void ShenandoahBarrierSet::arraycopy_pre(narrowOop* src, narrowOop* dst, size_t count) {
 311   arraycopy_pre_work(src, dst, count);
 312 }
 313 
 314 inline bool ShenandoahBarrierSet::skip_bulk_update(HeapWord* dst) {
 315   return dst >= _heap->heap_region_containing(dst)->get_update_watermark();
 316 }
 317 
 318 template <class T>
 319 void ShenandoahBarrierSet::arraycopy_update_impl(T* src, size_t count) {
 320   if (skip_bulk_update(reinterpret_cast<HeapWord*>(src))) return;
 321   if (_heap->is_evacuation_in_progress()) {
 322     ShenandoahEvacOOMScope oom_evac;
 323     arraycopy_work<T, true, true, false>(src, count);
 324   } else if (_heap->is_concurrent_traversal_in_progress()){
 325     ShenandoahEvacOOMScope oom_evac;
 326     arraycopy_work<T, true, true, true>(src, count);
 327   } else if (_heap->has_forwarded_objects()) {
 328     arraycopy_work<T, true, false, false>(src, count);
 329   }
 330 }
 331 
 332 void ShenandoahBarrierSet::arraycopy_update(oop* src, size_t count) {
 333   arraycopy_update_impl(src, count);
 334 }
 335 
 336 void ShenandoahBarrierSet::arraycopy_update(narrowOop* src, size_t count) {
 337   arraycopy_update_impl(src, count);
 338 }
 339 
 340 #endif // SHARE_GC_SHENANDOAH_SHENANDOAHBARRIERSET_INLINE_HPP
< prev index next >