< prev index next >

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

Print this page
rev 57734 : 8236880: Shenandoah: Move string dedup cleanup into concurrent phase

*** 148,157 **** --- 148,184 ---- if (ShenandoahStringDedup::is_enabled()) { ShenandoahStringDedup::parallel_oops_do(is_alive, keep_alive, worker_id); } } + ShenandoahConcurrentStringDedupRoots::ShenandoahConcurrentStringDedupRoots() { + if (ShenandoahStringDedup::is_enabled()) { + StringDedup::gc_prologue(true); + StringDedupTable_lock->lock_without_safepoint_check(); + StringDedupQueue_lock->lock_without_safepoint_check(); + } + } + + ShenandoahConcurrentStringDedupRoots::~ShenandoahConcurrentStringDedupRoots() { + if (ShenandoahStringDedup::is_enabled()) { + StringDedup::gc_epilogue(); + StringDedupQueue_lock->unlock(); + StringDedupTable_lock->unlock(); + } + } + + void ShenandoahConcurrentStringDedupRoots::oops_do(BoolObjectClosure* is_alive, OopClosure* keep_alive, uint worker_id) { + if (ShenandoahStringDedup::is_enabled()) { + assert_locked_or_safepoint_weak(StringDedupQueue_lock); + assert_locked_or_safepoint_weak(StringDedupTable_lock); + + StringDedupUnlinkOrOopsDoClosure sd_cl(is_alive, keep_alive); + StringDedupQueue::unlink_or_oops_do(&sd_cl); + StringDedupTable::unlink_or_oops_do(&sd_cl, worker_id); + } + } + ShenandoahRootProcessor::ShenandoahRootProcessor(ShenandoahPhaseTimings::Phase phase) : _heap(ShenandoahHeap::heap()), _phase(phase) { assert(SafepointSynchronize::is_at_safepoint(), "Must at safepoint"); _heap->phase_timings()->record_workers_start(_phase);
*** 185,204 **** if (_include_concurrent_roots) { CLDToOopClosure clds(oops, ClassLoaderData::_claim_strong); _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) : ShenandoahRootProcessor(phase), _thread_roots(n_workers > 1) { --- 212,230 ---- if (_include_concurrent_roots) { CLDToOopClosure clds(oops, ClassLoaderData::_claim_strong); _vm_roots.oops_do<OopClosure>(oops, worker_id); _cld_roots.cld_do(&clds, worker_id); _weak_roots.oops_do<OopClosure>(oops, worker_id); + _dedup_roots.oops_do(&always_true, 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); } } ShenandoahRootUpdater::ShenandoahRootUpdater(uint n_workers, ShenandoahPhaseTimings::Phase phase) : ShenandoahRootProcessor(phase), _thread_roots(n_workers > 1) {
< prev index next >