< prev index next >
src/share/vm/gc/shenandoah/shenandoahRootProcessor.cpp
Print this page
rev 12549 : [mq]: fixparsync2.patch
*** 179,183 ****
--- 179,222 ----
}
uint ShenandoahRootProcessor::n_workers() const {
return _srs.n_threads();
}
+
+ ShenandoahRootEvacuator::ShenandoahRootEvacuator(ShenandoahHeap* heap, uint n_workers, ShenandoahCollectorPolicy::TimingPhase phase) :
+ _process_strong_tasks(new SubTasksDone(SHENANDOAH_RP_PS_NumElements)),
+ _srs(n_workers),
+ _phase(phase),
+ _codecache_iterator(CodeCache::parallel_iterator())
+ {
+ heap->shenandoahPolicy()->record_workers_start(_phase);
+ }
+
+ ShenandoahRootEvacuator::~ShenandoahRootEvacuator() {
+ delete _process_strong_tasks;
+ ShenandoahHeap::heap()->shenandoahPolicy()->record_workers_end(_phase);
+ }
+
+ void ShenandoahRootEvacuator::process_evacuate_roots(OopClosure* oops,
+ CodeBlobClosure* blobs,
+ uint worker_id) {
+
+ ShenandoahPhaseTimes* phase_times = ShenandoahHeap::heap()->shenandoahPolicy()->phase_times();
+ {
+ bool is_par = n_workers() > 1;
+ ResourceMark rm;
+ ShenandoahParPhaseTimesTracker timer(phase_times, ShenandoahPhaseTimes::ThreadRoots, worker_id);
+ Threads::possibly_parallel_oops_do(is_par, oops, NULL);
+ }
+
+ {
+ ShenandoahParPhaseTimesTracker timer(phase_times, ShenandoahPhaseTimes::CodeCacheRoots, worker_id);
+ while (_codecache_iterator.parallel_blobs_do(blobs));
+ }
+
+ _process_strong_tasks->all_tasks_completed(n_workers());
+ }
+
+ uint ShenandoahRootEvacuator::n_workers() const {
+ return _srs.n_threads();
+ }
+
< prev index next >