181 ShenandoahRootUpdater::ShenandoahRootUpdater(uint n_workers, ShenandoahPhaseTimings::Phase phase) :
182 ShenandoahRootProcessor(phase),
183 _vm_roots(phase),
184 _cld_roots(phase, n_workers, false /*heap iteration*/),
185 _thread_roots(phase, n_workers > 1),
186 _weak_roots(phase),
187 _code_roots(phase) {
188 }
189
190 ShenandoahRootAdjuster::ShenandoahRootAdjuster(uint n_workers, ShenandoahPhaseTimings::Phase phase) :
191 ShenandoahRootProcessor(phase),
192 _vm_roots(phase),
193 _cld_roots(phase, n_workers, false /*heap iteration*/),
194 _thread_roots(phase, n_workers > 1),
195 _weak_roots(phase),
196 _code_roots(phase) {
197 assert(ShenandoahHeap::heap()->is_full_gc_in_progress(), "Full GC only");
198 }
199
200 void ShenandoahRootAdjuster::roots_do(uint worker_id, OopClosure* oops) {
201 NMethodToOopClosure code_blob_cl(oops, NMethodToOopClosure::FixRelocations);
202 ShenandoahNMethodAndDisarmClosure nmethods_and_disarm_Cl(oops);
203 NMethodToOopClosure* adjust_code_closure = ShenandoahCodeRoots::use_nmethod_barriers_for_mark() ?
204 static_cast<NMethodToOopClosure*>(&nmethods_and_disarm_Cl) :
205 static_cast<NMethodToOopClosure*>(&code_blob_cl);
206 CLDToOopClosure adjust_cld_closure(oops, ClassLoaderData::_claim_strong);
207
208 // Process light-weight/limited parallel roots then
209 _vm_roots.oops_do(oops, worker_id);
210 _weak_roots.oops_do<OopClosure>(oops, worker_id);
211 _cld_roots.cld_do(&adjust_cld_closure, worker_id);
212
213 // Process heavy-weight/fully parallel roots the last
214 _code_roots.nmethods_do(adjust_code_closure, worker_id);
215 _thread_roots.oops_do(oops, nullptr, worker_id);
216 }
217
218 ShenandoahHeapIterationRootScanner::ShenandoahHeapIterationRootScanner(uint n_workers) :
219 ShenandoahRootProcessor(ShenandoahPhaseTimings::heap_iteration_roots),
220 _thread_roots(ShenandoahPhaseTimings::heap_iteration_roots, false /*is par*/),
221 _vm_roots(ShenandoahPhaseTimings::heap_iteration_roots),
222 _cld_roots(ShenandoahPhaseTimings::heap_iteration_roots, n_workers, true /*heap iteration*/),
223 _weak_roots(ShenandoahPhaseTimings::heap_iteration_roots),
224 _code_roots(ShenandoahPhaseTimings::heap_iteration_roots) {
225 }
226
227 class ShenandoahMarkNMethodClosure : public NMethodClosure {
228 private:
229 OopClosure* const _oops;
230 BarrierSetNMethod* const _bs_nm;
231
232 public:
233 ShenandoahMarkNMethodClosure(OopClosure* oops) :
234 _oops(oops),
|
181 ShenandoahRootUpdater::ShenandoahRootUpdater(uint n_workers, ShenandoahPhaseTimings::Phase phase) :
182 ShenandoahRootProcessor(phase),
183 _vm_roots(phase),
184 _cld_roots(phase, n_workers, false /*heap iteration*/),
185 _thread_roots(phase, n_workers > 1),
186 _weak_roots(phase),
187 _code_roots(phase) {
188 }
189
190 ShenandoahRootAdjuster::ShenandoahRootAdjuster(uint n_workers, ShenandoahPhaseTimings::Phase phase) :
191 ShenandoahRootProcessor(phase),
192 _vm_roots(phase),
193 _cld_roots(phase, n_workers, false /*heap iteration*/),
194 _thread_roots(phase, n_workers > 1),
195 _weak_roots(phase),
196 _code_roots(phase) {
197 assert(ShenandoahHeap::heap()->is_full_gc_in_progress(), "Full GC only");
198 }
199
200 void ShenandoahRootAdjuster::roots_do(uint worker_id, OopClosure* oops) {
201 ShenandoahNMethodAndDisarmClosure nmethods_and_disarm_Cl(oops);
202 CLDToOopClosure adjust_cld_closure(oops, ClassLoaderData::_claim_strong);
203
204 // Process light-weight/limited parallel roots then
205 _vm_roots.oops_do(oops, worker_id);
206 _weak_roots.oops_do<OopClosure>(oops, worker_id);
207 _cld_roots.cld_do(&adjust_cld_closure, worker_id);
208
209 // Process heavy-weight/fully parallel roots the last
210 _code_roots.nmethods_do(&nmethods_and_disarm_Cl, worker_id);
211 _thread_roots.oops_do(oops, nullptr, worker_id);
212 }
213
214 ShenandoahHeapIterationRootScanner::ShenandoahHeapIterationRootScanner(uint n_workers) :
215 ShenandoahRootProcessor(ShenandoahPhaseTimings::heap_iteration_roots),
216 _thread_roots(ShenandoahPhaseTimings::heap_iteration_roots, false /*is par*/),
217 _vm_roots(ShenandoahPhaseTimings::heap_iteration_roots),
218 _cld_roots(ShenandoahPhaseTimings::heap_iteration_roots, n_workers, true /*heap iteration*/),
219 _weak_roots(ShenandoahPhaseTimings::heap_iteration_roots),
220 _code_roots(ShenandoahPhaseTimings::heap_iteration_roots) {
221 }
222
223 class ShenandoahMarkNMethodClosure : public NMethodClosure {
224 private:
225 OopClosure* const _oops;
226 BarrierSetNMethod* const _bs_nm;
227
228 public:
229 ShenandoahMarkNMethodClosure(OopClosure* oops) :
230 _oops(oops),
|