# HG changeset patch # Parent 9537cd47f4eba9a703a7aeb5fccea82876b2d58b diff -r 9537cd47f4eb src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp --- a/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp Wed Dec 11 22:05:55 2019 +0100 +++ b/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp Wed Dec 11 22:14:37 2019 +0100 @@ -265,7 +265,12 @@ ShenandoahMarkingContext* const marking_context = _heap->marking_context(); if (_heap->is_concurrent_root_in_progress() && !marking_context->is_marked(obj)) { - return NULL; + Thread* thr = Thread::current(); + if (thr->is_Java_thread()) { + return NULL; + } else { + return obj; + } } oop fwd = load_reference_barrier_not_null(obj); diff -r 9537cd47f4eb src/hotspot/share/gc/shenandoah/shenandoahBarrierSetNMethod.cpp --- a/src/hotspot/share/gc/shenandoah/shenandoahBarrierSetNMethod.cpp Wed Dec 11 22:05:55 2019 +0100 +++ b/src/hotspot/share/gc/shenandoah/shenandoahBarrierSetNMethod.cpp Wed Dec 11 22:14:37 2019 +0100 @@ -57,10 +57,8 @@ } // Heal oops and disarm - if (ShenandoahHeap::heap()->is_evacuation_in_progress()) { - ShenandoahEvacOOMScope scope; - ShenandoahNMethod::heal_nmethod(nm); - } + ShenandoahEvacOOMScope scope; + ShenandoahNMethod::heal_nmethod(nm); ShenandoahNMethod::disarm_nmethod(nm); return true; } diff -r 9537cd47f4eb src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp --- a/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp Wed Dec 11 22:05:55 2019 +0100 +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp Wed Dec 11 22:14:37 2019 +0100 @@ -1555,6 +1555,10 @@ verifier()->verify_before_evacuation(); } + if (ShenandoahConcurrentRoots::should_do_concurrent_class_unloading()) { + ShenandoahCodeRoots::prepare_concurrent_unloading(); + } + set_evacuation_in_progress(true); // From here on, we need to update references. set_has_forwarded_objects(true); @@ -1674,14 +1678,13 @@ void ShenandoahHeap::op_roots() { if (is_concurrent_root_in_progress()) { + if (ShenandoahConcurrentRoots::should_do_concurrent_roots()) { + ShenandoahConcurrentRootsEvacUpdateTask task; + workers()->run_task(&task); + } if (ShenandoahConcurrentRoots::should_do_concurrent_class_unloading()) { _unloader.unload(); } - - if (ShenandoahConcurrentRoots::should_do_concurrent_roots() && is_concurrent_root_in_progress()) { - ShenandoahConcurrentRootsEvacUpdateTask task; - workers()->run_task(&task); - } } set_concurrent_root_in_progress(false); @@ -2239,7 +2242,6 @@ void ShenandoahHeap::prepare_concurrent_unloading() { assert(SafepointSynchronize::is_at_safepoint(), "Must be at a safepoint"); if (ShenandoahConcurrentRoots::should_do_concurrent_class_unloading()) { - ShenandoahCodeRoots::prepare_concurrent_unloading(); _unloader.prepare(); } }