274 } |
274 } |
275 } |
275 } |
276 |
276 |
277 void ShenandoahConcurrentMark::update_roots(ShenandoahPhaseTimings::Phase root_phase) { |
277 void ShenandoahConcurrentMark::update_roots(ShenandoahPhaseTimings::Phase root_phase) { |
278 assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "Must be at a safepoint"); |
278 assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "Must be at a safepoint"); |
279 |
279 assert(root_phase == ShenandoahPhaseTimings::full_gc_roots || |
280 bool update_code_cache = true; // initialize to safer value |
280 root_phase == ShenandoahPhaseTimings::degen_gc_update_roots, |
281 switch (root_phase) { |
281 "Only for these phases"); |
282 case ShenandoahPhaseTimings::update_roots: |
|
283 case ShenandoahPhaseTimings::final_update_refs_roots: |
|
284 update_code_cache = false; |
|
285 break; |
|
286 case ShenandoahPhaseTimings::full_gc_roots: |
|
287 case ShenandoahPhaseTimings::degen_gc_update_roots: |
|
288 update_code_cache = true; |
|
289 break; |
|
290 default: |
|
291 ShouldNotReachHere(); |
|
292 } |
|
293 |
282 |
294 ShenandoahGCPhase phase(root_phase); |
283 ShenandoahGCPhase phase(root_phase); |
295 |
284 |
296 #if COMPILER2_OR_JVMCI |
285 #if COMPILER2_OR_JVMCI |
297 DerivedPointerTable::clear(); |
286 DerivedPointerTable::clear(); |
298 #endif |
287 #endif |
299 |
288 |
300 uint nworkers = _heap->workers()->active_workers(); |
289 uint nworkers = _heap->workers()->active_workers(); |
301 |
290 |
302 ShenandoahRootUpdater root_updater(nworkers, root_phase, update_code_cache); |
291 ShenandoahRootUpdater root_updater(nworkers, root_phase); |
303 ShenandoahUpdateRootsTask update_roots(&root_updater); |
292 ShenandoahUpdateRootsTask update_roots(&root_updater); |
304 _heap->workers()->run_task(&update_roots); |
293 _heap->workers()->run_task(&update_roots); |
305 |
294 |
306 #if COMPILER2_OR_JVMCI |
295 #if COMPILER2_OR_JVMCI |
307 DerivedPointerTable::update_pointers(); |
296 DerivedPointerTable::update_pointers(); |