# HG changeset patch # Parent b9787f124d93c1f71194b2485d2996f92fee80d5 diff --git a/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.cpp b/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.cpp --- a/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.cpp @@ -638,9 +638,9 @@ ShenandoahHeap* heap = ShenandoahHeap::heap(); ShenandoahConcurrentMark* cm = heap->concurrentMark(); - ShenandoahPushWorkerScope scope(_workers, - ergo_workers, - /* do_check = */ false); + ShenandoahPushWorkerQueuesScope scope(_workers, cm->task_queues(), + ergo_workers, + /* do_check = */ false); uint nworkers = _workers->active_workers(); cm->task_queues()->reserve(nworkers); if (UseShenandoahOWST) { @@ -722,6 +722,9 @@ ReferenceProcessorPhaseTimes pt(sh->gc_timer(), rp->num_queues()); + // Prepare for single-threaded mode + ShenandoahPushWorkerQueuesScope scope(workers, task_queues(), 1, /* do_check = */ false); + { ShenandoahGCPhase phase(phase_process); ShenandoahTerminationTracker phase_term(phase_process_termination); @@ -942,7 +945,7 @@ * with this worker id, we come back to process this queue in the normal loop. */ assert(queues->get_reserved() == heap->workers()->active_workers(), - "Need to reserve proper number of queues"); + "Need to reserve proper number of queues: reserved: %u, active: %u", queues->get_reserved(), heap->workers()->active_workers()); q = queues->claim_next(); while (q != NULL) { diff --git a/src/hotspot/share/gc/shenandoah/shenandoahTraversalGC.cpp b/src/hotspot/share/gc/shenandoah/shenandoahTraversalGC.cpp --- a/src/hotspot/share/gc/shenandoah/shenandoahTraversalGC.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahTraversalGC.cpp @@ -1093,9 +1093,10 @@ ShenandoahHeap* heap = ShenandoahHeap::heap(); ShenandoahTraversalGC* traversal_gc = heap->traversal_gc(); - ShenandoahPushWorkerScope scope(_workers, - ergo_workers, - /* do_check = */ false); + ShenandoahPushWorkerQueuesScope scope(_workers, + traversal_gc->task_queues(), + ergo_workers, + /* do_check = */ false); uint nworkers = _workers->active_workers(); traversal_gc->task_queues()->reserve(nworkers); if (UseShenandoahOWST) { @@ -1143,6 +1144,8 @@ ShenandoahTraversalRefProcTaskExecutor executor(workers); ReferenceProcessorPhaseTimes pt(sh->gc_timer(), rp->num_queues()); + // Prepare for single-threaded mode + ShenandoahPushWorkerQueuesScope scope(workers, task_queues(), 1, /* do_check = */ false); { ShenandoahGCPhase phase(phase_process); diff --git a/src/hotspot/share/gc/shenandoah/shenandoahWorkGroup.cpp b/src/hotspot/share/gc/shenandoah/shenandoahWorkGroup.cpp --- a/src/hotspot/share/gc/shenandoah/shenandoahWorkGroup.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahWorkGroup.cpp @@ -26,6 +26,7 @@ #include "gc/shenandoah/shenandoahHeap.hpp" #include "gc/shenandoah/shenandoahThreadLocalData.hpp" #include "gc/shenandoah/shenandoahWorkGroup.hpp" +#include "gc/shenandoah/shenandoahTaskqueue.hpp" #include "logging/log.hpp" @@ -61,6 +62,25 @@ _workers->update_active_workers(_old_workers); } +ShenandoahPushWorkerQueuesScope::ShenandoahPushWorkerQueuesScope(WorkGang* workers, ShenandoahObjToScanQueueSet* queues, uint nworkers, bool check) : + _workers(workers), _old_workers(workers->active_workers()), + _queues(queues), _n_workers(nworkers) { + _workers->update_active_workers(nworkers); + _queues->reserve(nworkers); + // bypass concurrent/parallel protocol check for non-regular paths, e.g. verifier, etc. + if (check) { + ShenandoahHeap::heap()->assert_gc_workers(nworkers); + } +} + +ShenandoahPushWorkerQueuesScope::~ShenandoahPushWorkerQueuesScope() { + assert(_workers->active_workers() == _n_workers, + "Active workers can not be changed within this scope"); + // Restore old worker value + _queues->reserve(_old_workers); + _workers->update_active_workers(_old_workers); +} + AbstractGangWorker* ShenandoahWorkGang::install_worker(uint which) { AbstractGangWorker* worker = WorkGang::install_worker(which); ShenandoahThreadLocalData::create(worker); diff --git a/src/hotspot/share/gc/shenandoah/shenandoahWorkGroup.hpp b/src/hotspot/share/gc/shenandoah/shenandoahWorkGroup.hpp --- a/src/hotspot/share/gc/shenandoah/shenandoahWorkGroup.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahWorkGroup.hpp @@ -27,6 +27,7 @@ #include "gc/shared/workgroup.hpp" #include "memory/allocation.hpp" +class ShenandoahObjToScanQueueSet; class ShenandoahWorkerScope : public StackObj { private: @@ -49,6 +50,18 @@ ~ShenandoahPushWorkerScope(); }; +class ShenandoahPushWorkerQueuesScope : StackObj { +private: + uint _n_workers; + uint _old_workers; + WorkGang* _workers; + ShenandoahObjToScanQueueSet* _queues; + +public: + ShenandoahPushWorkerQueuesScope(WorkGang* workers, ShenandoahObjToScanQueueSet* queues, uint nworkers, bool do_check = true); + ~ShenandoahPushWorkerQueuesScope(); +}; + class ShenandoahWorkGang : public WorkGang { private: bool _initialize_gclab;