|
@@ -200,10 +200,10 @@ class ShenandoahInitTraversalCollectionTask : public AbstractGangTask { |
|
|
|
|
|
class ShenandoahConcurrentTraversalCollectionTask : public AbstractGangTask { |
|
|
private: |
|
|
ShenandoahTaskTerminator* _terminator; |
|
|
TaskTerminator* _terminator; |
|
|
ShenandoahHeap* _heap; |
|
|
public: |
|
|
ShenandoahConcurrentTraversalCollectionTask(ShenandoahTaskTerminator* terminator) : |
|
|
ShenandoahConcurrentTraversalCollectionTask(TaskTerminator* terminator) : |
|
|
AbstractGangTask("Shenandoah Concurrent Traversal Collection"), |
|
|
_terminator(terminator), |
|
|
_heap(ShenandoahHeap::heap()) {} |
|
@@ -221,10 +221,10 @@ class ShenandoahConcurrentTraversalCollectionTask : public AbstractGangTask { |
|
|
class ShenandoahFinalTraversalCollectionTask : public AbstractGangTask { |
|
|
private: |
|
|
ShenandoahAllRootScanner* _rp; |
|
|
ShenandoahTaskTerminator* _terminator; |
|
|
TaskTerminator* _terminator; |
|
|
ShenandoahHeap* _heap; |
|
|
public: |
|
|
ShenandoahFinalTraversalCollectionTask(ShenandoahAllRootScanner* rp, ShenandoahTaskTerminator* terminator) : |
|
|
ShenandoahFinalTraversalCollectionTask(ShenandoahAllRootScanner* rp, TaskTerminator* terminator) : |
|
|
AbstractGangTask("Shenandoah Final Traversal Collection"), |
|
|
_rp(rp), |
|
|
_terminator(terminator), |
|
@@ -428,7 +428,7 @@ void ShenandoahTraversalGC::init_traversal_collection() { |
|
|
} |
|
|
} |
|
|
|
|
|
void ShenandoahTraversalGC::main_loop(uint w, ShenandoahTaskTerminator* t, bool sts_yield) { |
|
|
void ShenandoahTraversalGC::main_loop(uint w, TaskTerminator* t, bool sts_yield) { |
|
|
ShenandoahObjToScanQueue* q = task_queues()->queue(w); |
|
|
|
|
|
// Initialize live data. |
|
@@ -482,7 +482,7 @@ void ShenandoahTraversalGC::main_loop(uint w, ShenandoahTaskTerminator* t, bool |
|
|
} |
|
|
|
|
|
template <class T> |
|
|
void ShenandoahTraversalGC::main_loop_work(T* cl, jushort* live_data, uint worker_id, ShenandoahTaskTerminator* terminator, bool sts_yield) { |
|
|
void ShenandoahTraversalGC::main_loop_work(T* cl, jushort* live_data, uint worker_id, TaskTerminator* terminator, bool sts_yield) { |
|
|
ShenandoahObjToScanQueueSet* queues = task_queues(); |
|
|
ShenandoahObjToScanQueue* q = queues->queue(worker_id); |
|
|
ShenandoahConcurrentMark* conc_mark = _heap->concurrent_mark(); |
|
@@ -546,7 +546,7 @@ void ShenandoahTraversalGC::main_loop_work(T* cl, jushort* live_data, uint worke |
|
|
} |
|
|
} |
|
|
|
|
|
bool ShenandoahTraversalGC::check_and_handle_cancelled_gc(ShenandoahTaskTerminator* terminator, bool sts_yield) { |
|
|
bool ShenandoahTraversalGC::check_and_handle_cancelled_gc(TaskTerminator* terminator, bool sts_yield) { |
|
|
if (_heap->cancelled_gc()) { |
|
|
return true; |
|
|
} |
|
@@ -560,7 +560,7 @@ void ShenandoahTraversalGC::concurrent_traversal_collection() { |
|
|
task_queues()->reserve(nworkers); |
|
|
ShenandoahTerminationTracker tracker(ShenandoahPhaseTimings::conc_traversal_termination); |
|
|
|
|
|
ShenandoahTaskTerminator terminator(nworkers, task_queues()); |
|
|
TaskTerminator terminator(nworkers, task_queues()); |
|
|
ShenandoahConcurrentTraversalCollectionTask task(&terminator); |
|
|
_heap->workers()->run_task(&task); |
|
|
} |
|
@@ -585,7 +585,7 @@ void ShenandoahTraversalGC::final_traversal_collection() { |
|
|
ShenandoahAllRootScanner rp(nworkers, ShenandoahPhaseTimings::final_traversal_gc_work); |
|
|
ShenandoahTerminationTracker term(ShenandoahPhaseTimings::final_traversal_gc_termination); |
|
|
|
|
|
ShenandoahTaskTerminator terminator(nworkers, task_queues()); |
|
|
TaskTerminator terminator(nworkers, task_queues()); |
|
|
ShenandoahFinalTraversalCollectionTask task(&rp, &terminator); |
|
|
_heap->workers()->run_task(&task); |
|
|
#if COMPILER2_OR_JVMCI |
|
@@ -776,7 +776,7 @@ class ShenandoahTraversalPrecleanCompleteGCClosure : public VoidClosure { |
|
|
ShenandoahHeap* sh = ShenandoahHeap::heap(); |
|
|
ShenandoahTraversalGC* traversal_gc = sh->traversal_gc(); |
|
|
assert(sh->process_references(), "why else would we be here?"); |
|
|
ShenandoahTaskTerminator terminator(1, traversal_gc->task_queues()); |
|
|
TaskTerminator terminator(1, traversal_gc->task_queues()); |
|
|
shenandoah_assert_rp_isalive_installed(); |
|
|
traversal_gc->main_loop((uint) 0, &terminator, true); |
|
|
} |
|
@@ -943,11 +943,11 @@ void ShenandoahTraversalGC::preclean_weak_refs() { |
|
|
// Weak Reference Closures |
|
|
class ShenandoahTraversalDrainMarkingStackClosure: public VoidClosure { |
|
|
uint _worker_id; |
|
|
ShenandoahTaskTerminator* _terminator; |
|
|
TaskTerminator* _terminator; |
|
|
bool _reset_terminator; |
|
|
|
|
|
public: |
|
|
ShenandoahTraversalDrainMarkingStackClosure(uint worker_id, ShenandoahTaskTerminator* t, bool reset_terminator = false): |
|
|
ShenandoahTraversalDrainMarkingStackClosure(uint worker_id, TaskTerminator* t, bool reset_terminator = false): |
|
|
_worker_id(worker_id), |
|
|
_terminator(t), |
|
|
_reset_terminator(reset_terminator) { |
|
@@ -971,11 +971,11 @@ class ShenandoahTraversalDrainMarkingStackClosure: public VoidClosure { |
|
|
|
|
|
class ShenandoahTraversalSingleThreadedDrainMarkingStackClosure: public VoidClosure { |
|
|
uint _worker_id; |
|
|
ShenandoahTaskTerminator* _terminator; |
|
|
TaskTerminator* _terminator; |
|
|
bool _reset_terminator; |
|
|
|
|
|
public: |
|
|
ShenandoahTraversalSingleThreadedDrainMarkingStackClosure(uint worker_id, ShenandoahTaskTerminator* t, bool reset_terminator = false): |
|
|
ShenandoahTraversalSingleThreadedDrainMarkingStackClosure(uint worker_id, TaskTerminator* t, bool reset_terminator = false): |
|
|
_worker_id(worker_id), |
|
|
_terminator(t), |
|
|
_reset_terminator(reset_terminator) { |
|
@@ -1019,11 +1019,11 @@ void ShenandoahTraversalGC::weak_refs_work() { |
|
|
class ShenandoahTraversalRefProcTaskProxy : public AbstractGangTask { |
|
|
private: |
|
|
AbstractRefProcTaskExecutor::ProcessTask& _proc_task; |
|
|
ShenandoahTaskTerminator* _terminator; |
|
|
TaskTerminator* _terminator; |
|
|
|
|
|
public: |
|
|
ShenandoahTraversalRefProcTaskProxy(AbstractRefProcTaskExecutor::ProcessTask& proc_task, |
|
|
ShenandoahTaskTerminator* t) : |
|
|
TaskTerminator* t) : |
|
|
AbstractGangTask("Process reference objects in parallel"), |
|
|
_proc_task(proc_task), |
|
|
_terminator(t) { |
|
@@ -1064,7 +1064,7 @@ class ShenandoahTraversalRefProcTaskExecutor : public AbstractRefProcTaskExecuto |
|
|
/* do_check = */ false); |
|
|
uint nworkers = _workers->active_workers(); |
|
|
traversal_gc->task_queues()->reserve(nworkers); |
|
|
ShenandoahTaskTerminator terminator(nworkers, traversal_gc->task_queues()); |
|
|
TaskTerminator terminator(nworkers, traversal_gc->task_queues()); |
|
|
ShenandoahTraversalRefProcTaskProxy proc_task_proxy(task, &terminator); |
|
|
_workers->run_task(&proc_task_proxy); |
|
|
} |
|
@@ -1092,7 +1092,7 @@ void ShenandoahTraversalGC::weak_refs_work_doit() { |
|
|
// simplifies implementation. Since RP may decide to call complete_gc several |
|
|
// times, we need to be able to reuse the terminator. |
|
|
uint serial_worker_id = 0; |
|
|
ShenandoahTaskTerminator terminator(1, task_queues()); |
|
|
TaskTerminator terminator(1, task_queues()); |
|
|
ShenandoahTraversalSingleThreadedDrainMarkingStackClosure complete_gc(serial_worker_id, &terminator, /* reset_terminator = */ true); |
|
|
ShenandoahPushWorkerQueuesScope scope(workers, task_queues(), 1, /* do_check = */ false); |
|
|
|
|
|