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