< prev index next >

src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.cpp

Print this page

        

*** 25,34 **** --- 25,36 ---- #include "classfile/classLoaderDataGraph.hpp" #include "classfile/stringTable.hpp" #include "classfile/systemDictionary.hpp" #include "code/codeCache.hpp" + #include "gc/shenandoah/shenandoahClosures.inline.hpp" + #include "gc/shenandoah/shenandoahConcurrentRoots.hpp" #include "gc/shenandoah/shenandoahRootProcessor.inline.hpp" #include "gc/shenandoah/shenandoahHeap.hpp" #include "gc/shenandoah/shenandoahPhaseTimings.hpp" #include "gc/shenandoah/shenandoahStringDedup.hpp" #include "gc/shenandoah/shenandoahTimingTracker.hpp"
*** 157,174 **** ShenandoahRootProcessor::~ShenandoahRootProcessor() { assert(SafepointSynchronize::is_at_safepoint(), "Must at safepoint"); _heap->phase_timings()->record_workers_end(_phase); } ! ShenandoahRootEvacuator::ShenandoahRootEvacuator(uint n_workers, ShenandoahPhaseTimings::Phase phase, bool include_concurrent_roots) : ShenandoahRootProcessor(phase), _thread_roots(n_workers > 1), ! _include_concurrent_roots(include_concurrent_roots) { } void ShenandoahRootEvacuator::roots_do(uint worker_id, OopClosure* oops) { MarkingCodeBlobClosure blobsCl(oops, CodeBlobToOopClosure::FixRelocations); AlwaysTrueClosure always_true; _serial_roots.oops_do(oops, worker_id); _serial_weak_roots.weak_oops_do(oops, worker_id); if (_include_concurrent_roots) { --- 159,184 ---- ShenandoahRootProcessor::~ShenandoahRootProcessor() { assert(SafepointSynchronize::is_at_safepoint(), "Must at safepoint"); _heap->phase_timings()->record_workers_end(_phase); } ! ShenandoahRootEvacuator::ShenandoahRootEvacuator(uint n_workers, ! ShenandoahPhaseTimings::Phase phase, ! bool include_concurrent_roots, ! bool include_concurrent_code_roots) : ShenandoahRootProcessor(phase), _thread_roots(n_workers > 1), ! _include_concurrent_roots(include_concurrent_roots), ! _include_concurrent_code_roots(include_concurrent_code_roots) { } void ShenandoahRootEvacuator::roots_do(uint worker_id, OopClosure* oops) { MarkingCodeBlobClosure blobsCl(oops, CodeBlobToOopClosure::FixRelocations); + ShenandoahCodeBlobAndDisarmClosure blobs_and_disarm_Cl(oops); + CodeBlobToOopClosure* codes_cl = ShenandoahConcurrentRoots::can_do_concurrent_class_unloading() ? + static_cast<CodeBlobToOopClosure*>(&blobs_and_disarm_Cl) : + static_cast<CodeBlobToOopClosure*>(&blobsCl); AlwaysTrueClosure always_true; _serial_roots.oops_do(oops, worker_id); _serial_weak_roots.weak_oops_do(oops, worker_id); if (_include_concurrent_roots) {
*** 176,187 **** _vm_roots.oops_do<OopClosure>(oops, worker_id); _cld_roots.cld_do(&clds, worker_id); _weak_roots.oops_do<OopClosure>(oops, worker_id); } ! _thread_roots.oops_do(oops, NULL, worker_id); ! _code_roots.code_blobs_do(&blobsCl, worker_id); _dedup_roots.oops_do(&always_true, oops, worker_id); } ShenandoahRootUpdater::ShenandoahRootUpdater(uint n_workers, ShenandoahPhaseTimings::Phase phase) : --- 186,201 ---- _vm_roots.oops_do<OopClosure>(oops, worker_id); _cld_roots.cld_do(&clds, worker_id); _weak_roots.oops_do<OopClosure>(oops, worker_id); } ! if (_include_concurrent_code_roots) { ! _code_roots.code_blobs_do(codes_cl, worker_id); ! _thread_roots.oops_do(oops, NULL, worker_id); ! } else { ! _thread_roots.oops_do(oops, codes_cl, worker_id); ! } _dedup_roots.oops_do(&always_true, oops, worker_id); } ShenandoahRootUpdater::ShenandoahRootUpdater(uint n_workers, ShenandoahPhaseTimings::Phase phase) :
*** 194,213 **** _thread_roots(n_workers > 1) { assert(ShenandoahHeap::heap()->is_full_gc_in_progress(), "Full GC only"); } void ShenandoahRootAdjuster::roots_do(uint worker_id, OopClosure* oops) { ! CodeBlobToOopClosure adjust_code_closure(oops, CodeBlobToOopClosure::FixRelocations); CLDToOopClosure adjust_cld_closure(oops, ClassLoaderData::_claim_strong); AlwaysTrueClosure always_true; _serial_roots.oops_do(oops, worker_id); _vm_roots.oops_do(oops, worker_id); _thread_roots.oops_do(oops, NULL, worker_id); _cld_roots.cld_do(&adjust_cld_closure, worker_id); ! _code_roots.code_blobs_do(&adjust_code_closure, worker_id); _serial_weak_roots.weak_oops_do(oops, worker_id); _weak_roots.oops_do<OopClosure>(oops, worker_id); _dedup_roots.oops_do(&always_true, oops, worker_id); } --- 208,231 ---- _thread_roots(n_workers > 1) { assert(ShenandoahHeap::heap()->is_full_gc_in_progress(), "Full GC only"); } void ShenandoahRootAdjuster::roots_do(uint worker_id, OopClosure* oops) { ! CodeBlobToOopClosure code_blob_cl(oops, CodeBlobToOopClosure::FixRelocations); ! ShenandoahCodeBlobAndDisarmClosure blobs_and_disarm_Cl(oops); ! CodeBlobToOopClosure* adjust_code_closure = ShenandoahConcurrentRoots::can_do_concurrent_class_unloading() ? ! static_cast<CodeBlobToOopClosure*>(&blobs_and_disarm_Cl) : ! static_cast<CodeBlobToOopClosure*>(&code_blob_cl); CLDToOopClosure adjust_cld_closure(oops, ClassLoaderData::_claim_strong); AlwaysTrueClosure always_true; _serial_roots.oops_do(oops, worker_id); _vm_roots.oops_do(oops, worker_id); _thread_roots.oops_do(oops, NULL, worker_id); _cld_roots.cld_do(&adjust_cld_closure, worker_id); ! _code_roots.code_blobs_do(adjust_code_closure, worker_id); _serial_weak_roots.weak_oops_do(oops, worker_id); _weak_roots.oops_do<OopClosure>(oops, worker_id); _dedup_roots.oops_do(&always_true, oops, worker_id); }
< prev index next >