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
|