275
276 void ShenandoahConcurrentMark::update_roots(ShenandoahPhaseTimings::Phase root_phase) {
277 assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "Must be at a safepoint");
278
279 bool update_code_cache = true; // initialize to safer value
280 switch (root_phase) {
281 case ShenandoahPhaseTimings::update_roots:
282 case ShenandoahPhaseTimings::final_update_refs_roots:
283 update_code_cache = false;
284 break;
285 case ShenandoahPhaseTimings::full_gc_roots:
286 case ShenandoahPhaseTimings::degen_gc_update_roots:
287 update_code_cache = true;
288 break;
289 default:
290 ShouldNotReachHere();
291 }
292
293 ShenandoahGCPhase phase(root_phase);
294
295 #if defined(COMPILER2) || INCLUDE_JVMCI
296 DerivedPointerTable::clear();
297 #endif
298
299 uint nworkers = _heap->workers()->active_workers();
300
301 ShenandoahRootUpdater root_updater(nworkers, root_phase, update_code_cache);
302 ShenandoahUpdateRootsTask update_roots(&root_updater);
303 _heap->workers()->run_task(&update_roots);
304
305 #if defined(COMPILER2) || INCLUDE_JVMCI
306 DerivedPointerTable::update_pointers();
307 #endif
308 }
309
310 class ShenandoahUpdateThreadRootsTask : public AbstractGangTask {
311 private:
312 ShenandoahThreadRoots _thread_roots;
313 ShenandoahPhaseTimings::Phase _phase;
314 public:
315 ShenandoahUpdateThreadRootsTask(bool is_par, ShenandoahPhaseTimings::Phase phase) :
316 AbstractGangTask("Shenandoah Update Thread Roots"),
317 _thread_roots(is_par),
318 _phase(phase) {
319 ShenandoahHeap::heap()->phase_timings()->record_workers_start(_phase);
320 }
321
322 ~ShenandoahUpdateThreadRootsTask() {
323 ShenandoahHeap::heap()->phase_timings()->record_workers_end(_phase);
324 }
325 void work(uint worker_id) {
|
275
276 void ShenandoahConcurrentMark::update_roots(ShenandoahPhaseTimings::Phase root_phase) {
277 assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "Must be at a safepoint");
278
279 bool update_code_cache = true; // initialize to safer value
280 switch (root_phase) {
281 case ShenandoahPhaseTimings::update_roots:
282 case ShenandoahPhaseTimings::final_update_refs_roots:
283 update_code_cache = false;
284 break;
285 case ShenandoahPhaseTimings::full_gc_roots:
286 case ShenandoahPhaseTimings::degen_gc_update_roots:
287 update_code_cache = true;
288 break;
289 default:
290 ShouldNotReachHere();
291 }
292
293 ShenandoahGCPhase phase(root_phase);
294
295 #if COMPILER2_OR_JVMCI
296 DerivedPointerTable::clear();
297 #endif
298
299 uint nworkers = _heap->workers()->active_workers();
300
301 ShenandoahRootUpdater root_updater(nworkers, root_phase, update_code_cache);
302 ShenandoahUpdateRootsTask update_roots(&root_updater);
303 _heap->workers()->run_task(&update_roots);
304
305 #if COMPILER2_OR_JVMCI
306 DerivedPointerTable::update_pointers();
307 #endif
308 }
309
310 class ShenandoahUpdateThreadRootsTask : public AbstractGangTask {
311 private:
312 ShenandoahThreadRoots _thread_roots;
313 ShenandoahPhaseTimings::Phase _phase;
314 public:
315 ShenandoahUpdateThreadRootsTask(bool is_par, ShenandoahPhaseTimings::Phase phase) :
316 AbstractGangTask("Shenandoah Update Thread Roots"),
317 _thread_roots(is_par),
318 _phase(phase) {
319 ShenandoahHeap::heap()->phase_timings()->record_workers_start(_phase);
320 }
321
322 ~ShenandoahUpdateThreadRootsTask() {
323 ShenandoahHeap::heap()->phase_timings()->record_workers_end(_phase);
324 }
325 void work(uint worker_id) {
|