--- old/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.inline.hpp 2019-05-13 10:47:17.148183890 -0400 +++ new/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.inline.hpp 2019-05-13 10:47:16.825183295 -0400 @@ -25,22 +25,48 @@ #define SHARE_GC_SHENANDOAH_SHENANDOAHROOTPROCESSOR_INLINE_HPP #include "gc/shenandoah/shenandoahRootProcessor.hpp" +#include "gc/shenandoah/shenandoahTimingTracker.hpp" -template -void ShenandoahRootProcessor::update_all_roots(OopClosure* oops, - CLDClosure* clds, - CodeBlobClosure* blobs, - ThreadClosure* thread_cl, - uint worker_id) { - process_all_roots(oops, clds, blobs, thread_cl, worker_id); - - IsAlive is_alive; - _weak_processor_task.work(worker_id, &is_alive, oops); - _processed_weak_roots = true; +template +void ShenandoahWeakRoots::oops_do(IsAlive* is_alive, KeepAlive* keep_alive, uint worker_id) { + _task.work(worker_id, is_alive, keep_alive); +} + +template +ShenandoahCodeCacheRoot::ShenandoahCodeCacheRoot() { + nmethod::oops_do_marking_prologue(); +} + +template +void ShenandoahCodeCacheRoot::code_blobs_do(CodeBlobClosure* blob_cl, uint worker_id) { + ShenandoahWorkerTimings* worker_times = ShenandoahHeap::heap()->phase_timings()->worker_times(); + ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::CodeCacheRoots, worker_id); + _coderoots_iterator.possibly_parallel_blobs_do(blob_cl); +} + +template +ShenandoahCodeCacheRoot::~ShenandoahCodeCacheRoot() { + nmethod::oops_do_marking_epilogue(); +} + +template +void ShenandoahRootUpdater::roots_do(uint worker_id, IsAlive* is_alive, KeepAlive* keep_alive) { + CodeBlobToOopClosure update_blobs(keep_alive, CodeBlobToOopClosure::FixRelocations); + CLDToOopClosure clds(keep_alive, ClassLoaderData::_claim_strong); + CLDToOopClosure* weak_clds = ShenandoahHeap::heap()->unload_classes() ? NULL : &clds; + + _serial_roots.oops_do(keep_alive, worker_id); - if (ShenandoahStringDedup::is_enabled()) { - ShenandoahStringDedup::parallel_oops_do(&is_alive, oops, worker_id); + _thread_roots.oops_do(keep_alive, NULL, worker_id); + _cld_roots.clds_do(&clds, weak_clds, worker_id); + + if(_update_code_cache) { + _code_roots.code_blobs_do(&update_blobs, worker_id); } + + _weak_roots.oops_do(is_alive, keep_alive, worker_id); + _dedup_roots.oops_do(is_alive, keep_alive, worker_id); } + #endif // SHARE_GC_SHENANDOAH_SHENANDOAHROOTPROCESSOR_INLINE_HPP