--- old/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.cpp 2019-06-18 13:08:44.652208704 -0400 +++ new/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.cpp 2019-06-18 13:08:44.320208327 -0400 @@ -35,7 +35,7 @@ #include "gc/shenandoah/shenandoahStringDedup.hpp" #include "gc/shenandoah/shenandoahTimingTracker.hpp" #include "gc/shenandoah/shenandoahVMOperations.hpp" -#include "gc/shared/weakProcessor.inline.hpp" +#include "jfr/jfr.hpp" #include "memory/allocation.inline.hpp" #include "memory/iterator.hpp" #include "memory/resourceArea.hpp" @@ -71,6 +71,40 @@ _jvmti_root.oops_do(cl, worker_id); } +ShenandoahWeakSerialRoot::ShenandoahWeakSerialRoot(ShenandoahWeakSerialRoot::WeakOopsDo weak_oops_do, ShenandoahPhaseTimings::GCParPhases phase) : + _claimed(false), _weak_oops_do(weak_oops_do), _phase(phase) { +} + +void ShenandoahWeakSerialRoot::weak_oops_do(BoolObjectClosure* is_alive, OopClosure* keep_alive, uint worker_id) { + if (!_claimed && Atomic::cmpxchg(true, &_claimed, false) == false) { + ShenandoahWorkerTimings* worker_times = ShenandoahHeap::heap()->phase_timings()->worker_times(); + ShenandoahWorkerTimingsTracker timer(worker_times, _phase, worker_id); + _weak_oops_do(is_alive, keep_alive); + } +} + +#if INCLUDE_JVMTI +ShenandoahJVMTIWeakRoot::ShenandoahJVMTIWeakRoot() : + ShenandoahWeakSerialRoot(&JvmtiExport::weak_oops_do, ShenandoahPhaseTimings::JVMTIWeakRoots) { +} +#endif // INCLUDE_JVMTI + +#if INCLUDE_JFR +ShenandoahJFRWeakRoot::ShenandoahJFRWeakRoot() : + ShenandoahWeakSerialRoot(&Jfr::weak_oops_do, ShenandoahPhaseTimings::JFRWeakRoots) { +} +#endif // INCLUDE_JFR + +void ShenandoahSerialWeakRoots::weak_oops_do(BoolObjectClosure* is_alive, OopClosure* keep_alive, uint worker_id) { + JVMTI_ONLY(_jvmti_weak_roots.weak_oops_do(is_alive, keep_alive, worker_id);) + JFR_ONLY(_jfr_weak_roots.weak_oops_do(is_alive, keep_alive, worker_id);) +} + +void ShenandoahSerialWeakRoots::weak_oops_do(OopClosure* cl, uint worker_id) { + AlwaysTrueClosure always_true; + weak_oops_do(&always_true, cl, worker_id); +} + ShenandoahThreadRoots::ShenandoahThreadRoots(bool is_par) : _is_par(is_par) { Threads::change_thread_claim_token(); } @@ -93,17 +127,6 @@ Threads::assert_all_threads_claimed(); } -ShenandoahWeakRoots::ShenandoahWeakRoots(uint n_workers) : - _process_timings(n_workers), - _task(&_process_timings, n_workers) { -} - -ShenandoahWeakRoots::~ShenandoahWeakRoots() { - ShenandoahWorkerTimings* worker_times = ShenandoahHeap::heap()->phase_timings()->worker_times(); - ShenandoahTimingConverter::weak_processing_timing_to_shenandoah_timing(&_process_timings, - worker_times); -} - ShenandoahStringDedupRoots::ShenandoahStringDedupRoots() { if (ShenandoahStringDedup::is_enabled()) { StringDedup::gc_prologue(false); @@ -147,7 +170,6 @@ ShenandoahRootEvacuator::ShenandoahRootEvacuator(uint n_workers, ShenandoahPhaseTimings::Phase phase, bool include_concurrent_roots) : ShenandoahRootProcessor(phase), _thread_roots(n_workers > 1), - _weak_roots(n_workers), _include_concurrent_roots(include_concurrent_roots) { } @@ -157,29 +179,28 @@ AlwaysTrueClosure always_true; _serial_roots.oops_do(oops, worker_id); + _serial_weak_roots.weak_oops_do(oops, worker_id); if (_include_concurrent_roots) { _jni_roots.oops_do(oops, worker_id); + _weak_roots.oops_do(oops, worker_id); } _thread_roots.oops_do(oops, NULL, worker_id); _cld_roots.clds_do(&clds, &clds, worker_id); _code_roots.code_blobs_do(&blobsCl, worker_id); - _weak_roots.oops_do(&always_true, oops, worker_id); _dedup_roots.oops_do(&always_true, oops, worker_id); } ShenandoahRootUpdater::ShenandoahRootUpdater(uint n_workers, ShenandoahPhaseTimings::Phase phase, bool update_code_cache) : ShenandoahRootProcessor(phase), _thread_roots(n_workers > 1), - _weak_roots(n_workers), _update_code_cache(update_code_cache) { } ShenandoahRootAdjuster::ShenandoahRootAdjuster(uint n_workers, ShenandoahPhaseTimings::Phase phase) : ShenandoahRootProcessor(phase), - _thread_roots(n_workers > 1), - _weak_roots(n_workers) { + _thread_roots(n_workers > 1) { assert(ShenandoahHeap::heap()->is_full_gc_in_progress(), "Full GC only"); } @@ -195,6 +216,7 @@ _cld_roots.clds_do(&adjust_cld_closure, NULL, worker_id); _code_roots.code_blobs_do(&adjust_code_closure, worker_id); - _weak_roots.oops_do(&always_true, oops, worker_id); + _serial_weak_roots.weak_oops_do(oops, worker_id); + _weak_roots.oops_do(oops, worker_id); _dedup_roots.oops_do(&always_true, oops, worker_id); }