--- a/src/hotspot/share/gc/shenandoah/shenandoahTraversalGC.cpp Fri May 17 12:33:37 2019 +0200
+++ b/src/hotspot/share/gc/shenandoah/shenandoahTraversalGC.cpp Fri May 17 09:52:35 2019 -0400
@@ -161,11 +161,13 @@
class ShenandoahInitTraversalCollectionTask : public AbstractGangTask {
private:
- ShenandoahRootProcessor* _rp;
+ ShenandoahRootScanner* _rp;
ShenandoahHeap* _heap;
ShenandoahCsetCodeRootsIterator* _cset_coderoots;
+ ShenandoahStringDedupRoots _dedup_roots;
+
public:
- ShenandoahInitTraversalCollectionTask(ShenandoahRootProcessor* rp, ShenandoahCsetCodeRootsIterator* cset_coderoots) :
+ ShenandoahInitTraversalCollectionTask(ShenandoahRootScanner* rp, ShenandoahCsetCodeRootsIterator* cset_coderoots) :
AbstractGangTask("Shenandoah Init Traversal Collection"),
_rp(rp),
_heap(ShenandoahHeap::heap()),
@@ -191,18 +193,17 @@
ShenandoahMarkCLDClosure cld_cl(&roots_cl);
MarkingCodeBlobClosure code_cl(&roots_cl, CodeBlobToOopClosure::FixRelocations);
if (unload_classes) {
- _rp->process_strong_roots(&roots_cl, &cld_cl, NULL, NULL, worker_id);
+ _rp->strong_roots_do(worker_id, &roots_cl);
// Need to pre-evac code roots here. Otherwise we might see from-space constants.
ShenandoahWorkerTimings* worker_times = _heap->phase_timings()->worker_times();
ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::CodeCacheRoots, worker_id);
_cset_coderoots->possibly_parallel_blobs_do(&code_cl);
} else {
- _rp->process_all_roots(&roots_cl, &cld_cl, &code_cl, NULL, worker_id);
+ _rp->roots_do(worker_id, &roots_cl, &cld_cl, &code_cl);
}
- if (ShenandoahStringDedup::is_enabled()) {
- AlwaysTrueClosure is_alive;
- ShenandoahStringDedup::parallel_oops_do(&is_alive, &roots_cl, worker_id);
- }
+
+ AlwaysTrueClosure is_alive;
+ _dedup_roots.oops_do(&is_alive, &roots_cl, worker_id);
}
}
};
@@ -230,11 +231,11 @@
class ShenandoahFinalTraversalCollectionTask : public AbstractGangTask {
private:
- ShenandoahRootProcessor* _rp;
+ ShenandoahRootScanner* _rp;
ShenandoahTaskTerminator* _terminator;
ShenandoahHeap* _heap;
public:
- ShenandoahFinalTraversalCollectionTask(ShenandoahRootProcessor* rp, ShenandoahTaskTerminator* terminator) :
+ ShenandoahFinalTraversalCollectionTask(ShenandoahRootScanner* rp, ShenandoahTaskTerminator* terminator) :
AbstractGangTask("Shenandoah Final Traversal Collection"),
_rp(rp),
_terminator(terminator),
@@ -273,23 +274,23 @@
// roots here.
if (!_heap->is_degenerated_gc_in_progress()) {
ShenandoahTraversalClosure roots_cl(q, rp);
- CLDToOopClosure cld_cl(&roots_cl, ClassLoaderData::_claim_strong);
ShenandoahTraversalSATBThreadsClosure tc(&satb_cl);
if (unload_classes) {
ShenandoahRemarkCLDClosure remark_cld_cl(&roots_cl);
- _rp->process_strong_roots(&roots_cl, &remark_cld_cl, NULL, &tc, worker_id);
+ _rp->strong_roots_do(worker_id, &roots_cl, &remark_cld_cl, NULL, &tc);
} else {
- _rp->process_all_roots(&roots_cl, &cld_cl, NULL, &tc, worker_id);
+ CLDToOopClosure cld_cl(&roots_cl, ClassLoaderData::_claim_strong);
+ _rp->roots_do(worker_id, &roots_cl, &cld_cl, NULL, &tc);
}
} else {
ShenandoahTraversalDegenClosure roots_cl(q, rp);
- CLDToOopClosure cld_cl(&roots_cl, ClassLoaderData::_claim_strong);
ShenandoahTraversalSATBThreadsClosure tc(&satb_cl);
if (unload_classes) {
ShenandoahRemarkCLDClosure remark_cld_cl(&roots_cl);
- _rp->process_strong_roots(&roots_cl, &remark_cld_cl, NULL, &tc, worker_id);
+ _rp->strong_roots_do(worker_id, &roots_cl, &remark_cld_cl, NULL, &tc);
} else {
- _rp->process_all_roots(&roots_cl, &cld_cl, NULL, &tc, worker_id);
+ CLDToOopClosure cld_cl(&roots_cl, ClassLoaderData::_claim_strong);
+ _rp->roots_do(worker_id, &roots_cl, &cld_cl, NULL, &tc);
}
}
@@ -309,6 +310,9 @@
_task_queues(new ShenandoahObjToScanQueueSet(heap->max_workers())),
_traversal_set(ShenandoahHeapRegionSet()) {
+ // Traversal does not support concurrent code root scanning
+ FLAG_SET_DEFAULT(ShenandoahConcurrentScanCodeRoots, false);
+
uint num_queues = heap->max_workers();
for (uint i = 0; i < num_queues; ++i) {
ShenandoahObjToScanQueue* task_queue = new ShenandoahObjToScanQueue();
@@ -411,7 +415,7 @@
{
uint nworkers = _heap->workers()->active_workers();
task_queues()->reserve(nworkers);
- ShenandoahRootProcessor rp(_heap, nworkers, ShenandoahPhaseTimings::init_traversal_gc_work);
+ ShenandoahRootScanner rp(nworkers, ShenandoahPhaseTimings::init_traversal_gc_work);
ShenandoahCsetCodeRootsIterator cset_coderoots = ShenandoahCodeRoots::cset_iterator();
@@ -584,7 +588,7 @@
task_queues()->reserve(nworkers);
// Finish traversal
- ShenandoahRootProcessor rp(_heap, nworkers, ShenandoahPhaseTimings::final_traversal_gc_work);
+ ShenandoahRootScanner rp(nworkers, ShenandoahPhaseTimings::final_traversal_gc_work);
ShenandoahTerminationTracker term(ShenandoahPhaseTimings::final_traversal_gc_termination);
ShenandoahTaskTerminator terminator(nworkers, task_queues());
@@ -693,10 +697,10 @@
class ShenandoahTraversalFixRootsTask : public AbstractGangTask {
private:
- ShenandoahRootProcessor* _rp;
+ ShenandoahRootUpdater* _rp;
public:
- ShenandoahTraversalFixRootsTask(ShenandoahRootProcessor* rp) :
+ ShenandoahTraversalFixRootsTask(ShenandoahRootUpdater* rp) :
AbstractGangTask("Shenandoah traversal fix roots"),
_rp(rp) {
assert(ShenandoahHeap::heap()->has_forwarded_objects(), "Must be");
@@ -705,9 +709,8 @@
void work(uint worker_id) {
ShenandoahParallelWorkerSession worker_session(worker_id);
ShenandoahTraversalFixRootsClosure cl;
- MarkingCodeBlobClosure blobsCl(&cl, CodeBlobToOopClosure::FixRelocations);
- CLDToOopClosure cldCl(&cl, ClassLoaderData::_claim_strong);
- _rp->update_all_roots<ShenandoahForwardedIsAliveClosure>(&cl, &cldCl, &blobsCl, NULL, worker_id);
+ ShenandoahForwardedIsAliveClosure is_alive;
+ _rp->roots_do<ShenandoahForwardedIsAliveClosure, ShenandoahTraversalFixRootsClosure>(worker_id, &is_alive, &cl);
}
};
@@ -715,7 +718,7 @@
#if defined(COMPILER2) || INCLUDE_JVMCI
DerivedPointerTable::clear();
#endif
- ShenandoahRootProcessor rp(_heap, _heap->workers()->active_workers(), ShenandoahPhaseTimings::final_traversal_update_roots);
+ ShenandoahRootUpdater rp(_heap->workers()->active_workers(), ShenandoahPhaseTimings::final_traversal_update_roots, true /* update code cache */);
ShenandoahTraversalFixRootsTask update_roots_task(&rp);
_heap->workers()->run_task(&update_roots_task);
#if defined(COMPILER2) || INCLUDE_JVMCI