< 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 >