196 template <typename T>
197 void ShenandoahSTWRootScanner::roots_do(T* oops, uint worker_id) {
198 MarkingNMethodClosure nmethods_cl(oops);
199 CLDToOopClosure clds(oops, ClassLoaderData::_claim_strong);
200 ResourceMark rm;
201
202 if (_unload_classes) {
203 _thread_roots.oops_do(oops, &nmethods_cl, worker_id);
204 _cld_roots.always_strong_cld_do(&clds, worker_id);
205 } else {
206 _thread_roots.oops_do(oops, nullptr, worker_id);
207 _code_roots.nmethods_do(&nmethods_cl, worker_id);
208 _cld_roots.cld_do(&clds, worker_id);
209 }
210
211 _vm_roots.oops_do<T>(oops, worker_id);
212 }
213
214 template <typename IsAlive, typename KeepAlive>
215 void ShenandoahRootUpdater::roots_do(uint worker_id, IsAlive* is_alive, KeepAlive* keep_alive) {
216 NMethodToOopClosure update_nmethods(keep_alive, NMethodToOopClosure::FixRelocations);
217 ShenandoahNMethodAndDisarmClosure nmethods_and_disarm_Cl(keep_alive);
218 CLDToOopClosure clds(keep_alive, ClassLoaderData::_claim_strong);
219
220 // Process light-weight/limited parallel roots then
221 _vm_roots.oops_do(keep_alive, worker_id);
222 _weak_roots.weak_oops_do<IsAlive, KeepAlive>(is_alive, keep_alive, worker_id);
223 _cld_roots.cld_do(&clds, worker_id);
224
225 // Process heavy-weight/fully parallel roots the last
226 _code_roots.nmethods_do(&nmethods_and_disarm_Cl, worker_id);
227 _thread_roots.oops_do(keep_alive, nullptr, worker_id);
228 }
229
230 #endif // SHARE_GC_SHENANDOAH_SHENANDOAHROOTPROCESSOR_INLINE_HPP
|
196 template <typename T>
197 void ShenandoahSTWRootScanner::roots_do(T* oops, uint worker_id) {
198 MarkingNMethodClosure nmethods_cl(oops);
199 CLDToOopClosure clds(oops, ClassLoaderData::_claim_strong);
200 ResourceMark rm;
201
202 if (_unload_classes) {
203 _thread_roots.oops_do(oops, &nmethods_cl, worker_id);
204 _cld_roots.always_strong_cld_do(&clds, worker_id);
205 } else {
206 _thread_roots.oops_do(oops, nullptr, worker_id);
207 _code_roots.nmethods_do(&nmethods_cl, worker_id);
208 _cld_roots.cld_do(&clds, worker_id);
209 }
210
211 _vm_roots.oops_do<T>(oops, worker_id);
212 }
213
214 template <typename IsAlive, typename KeepAlive>
215 void ShenandoahRootUpdater::roots_do(uint worker_id, IsAlive* is_alive, KeepAlive* keep_alive) {
216 NMethodToOopClosure nmethods_cl(keep_alive, NMethodToOopClosure::FixRelocations);
217 CLDToOopClosure clds(keep_alive, ClassLoaderData::_claim_strong);
218
219 // Process light-weight/limited parallel roots then
220 _vm_roots.oops_do(keep_alive, worker_id);
221 _weak_roots.weak_oops_do<IsAlive, KeepAlive>(is_alive, keep_alive, worker_id);
222 _cld_roots.cld_do(&clds, worker_id);
223
224 // Process heavy-weight/fully parallel roots the last
225 _code_roots.nmethods_do(&nmethods_cl, worker_id);
226 _thread_roots.oops_do(keep_alive, nullptr, worker_id);
227 }
228
229 #endif // SHARE_GC_SHENANDOAH_SHENANDOAHROOTPROCESSOR_INLINE_HPP
|