< prev index next >

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

Print this page
rev 55429 : 8226413: Shenandoah: Separate root scanner for SH::object_iterate()

*** 29,38 **** --- 29,39 ---- #include "gc/shenandoah/shenandoahHeuristics.hpp" #include "gc/shenandoah/shenandoahRootProcessor.hpp" #include "gc/shenandoah/shenandoahTimingTracker.hpp" #include "gc/shenandoah/shenandoahUtils.hpp" #include "memory/resourceArea.hpp" + #include "runtime/safepoint.hpp" template <bool CONCURRENT> ShenandoahJNIHandleRoots<CONCURRENT>::ShenandoahJNIHandleRoots() : _itr(JNIHandles::global_handles()) { }
*** 52,61 **** --- 53,83 ---- template <typename IsAlive, typename KeepAlive> void ShenandoahWeakRoots::oops_do(IsAlive* is_alive, KeepAlive* keep_alive, uint worker_id) { _task.work<IsAlive, KeepAlive>(worker_id, is_alive, keep_alive); } + template <bool SINGLE_THREADED> + ShenandoahClassLoaderDataRoots<SINGLE_THREADED>::ShenandoahClassLoaderDataRoots() { + if (!SINGLE_THREADED) { + ClassLoaderDataGraph::clear_claimed_marks(); + } + } + + template <bool SINGLE_THREADED> + void ShenandoahClassLoaderDataRoots<SINGLE_THREADED>::clds_do(CLDClosure* strong_clds, CLDClosure* weak_clds, uint worker_id) { + if (SINGLE_THREADED) { + assert(SafepointSynchronize::is_at_safepoint(), "Must be at a safepoint"); + assert(Thread::current()->is_VM_thread(), "Single threaded CLDG iteration can only be done by VM thread"); + + ClassLoaderDataGraph::roots_cld_do(strong_clds, weak_clds); + } else { + ShenandoahWorkerTimings* worker_times = ShenandoahHeap::heap()->phase_timings()->worker_times(); + ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::CLDGRoots, worker_id); + ClassLoaderDataGraph::roots_cld_do(strong_clds, weak_clds); + } + } + template <typename ITR> ShenandoahCodeCacheRoots<ITR>::ShenandoahCodeCacheRoots() { nmethod::oops_do_marking_prologue(); }
*** 129,165 **** _code_roots.code_blobs_do(code, worker_id); } } template <typename ITR> - void ShenandoahRootScanner<ITR>::roots_do_unchecked(OopClosure* oops) { - CLDToOopClosure clds(oops, ClassLoaderData::_claim_strong); - MarkingCodeBlobClosure code(oops, !CodeBlobToOopClosure::FixRelocations); - ShenandoahParallelOopsDoThreadClosure tc_cl(oops, &code, NULL); - ResourceMark rm; - - _serial_roots.oops_do(oops, 0); - _jni_roots.oops_do(oops, 0); - _cld_roots.clds_do(&clds, &clds, 0); - _thread_roots.threads_do(&tc_cl, 0); - _code_roots.code_blobs_do(&code, 0); - } - - template <typename ITR> - void ShenandoahRootScanner<ITR>::strong_roots_do_unchecked(OopClosure* oops) { - CLDToOopClosure clds(oops, ClassLoaderData::_claim_strong); - MarkingCodeBlobClosure code(oops, !CodeBlobToOopClosure::FixRelocations); - ShenandoahParallelOopsDoThreadClosure tc_cl(oops, &code, NULL); - ResourceMark rm; - - _serial_roots.oops_do(oops, 0); - _jni_roots.oops_do(oops, 0); - _cld_roots.clds_do(&clds, NULL, 0); - _thread_roots.threads_do(&tc_cl, 0); - } - - template <typename ITR> void ShenandoahRootScanner<ITR>::strong_roots_do(uint worker_id, OopClosure* oops, CLDClosure* clds, CodeBlobClosure* code, ThreadClosure* tc) { assert(ShenandoahHeap::heap()->unload_classes(), "Should be used during class unloading"); ShenandoahParallelOopsDoThreadClosure tc_cl(oops, code, tc); ResourceMark rm; --- 151,160 ----
< prev index next >