73 |
73 |
74 void ShenandoahStringDedup::parallel_oops_do(BoolObjectClosure* is_alive, OopClosure* cl, uint worker_id) { |
74 void ShenandoahStringDedup::parallel_oops_do(BoolObjectClosure* is_alive, OopClosure* cl, uint worker_id) { |
75 assert(SafepointSynchronize::is_at_safepoint(), "Must be at a safepoint"); |
75 assert(SafepointSynchronize::is_at_safepoint(), "Must be at a safepoint"); |
76 assert(is_enabled(), "String deduplication not enabled"); |
76 assert(is_enabled(), "String deduplication not enabled"); |
77 |
77 |
78 ShenandoahWorkerTimings* worker_times = ShenandoahHeap::heap()->phase_timings()->worker_times(); |
78 StringDedupUnlinkOrOopsDoClosure sd_cl(is_alive, cl); |
|
79 if (ShenandoahGCPhase::is_root_work_phase()) { |
|
80 ShenandoahWorkerTimings* worker_times = ShenandoahHeap::heap()->phase_timings()->worker_times(); |
|
81 { |
|
82 ShenandoahWorkerTimingsTracker x(worker_times, ShenandoahPhaseTimings::StringDedupQueueRoots, worker_id); |
|
83 StringDedupQueue::unlink_or_oops_do(&sd_cl); |
|
84 } |
79 |
85 |
80 StringDedupUnlinkOrOopsDoClosure sd_cl(is_alive, cl); |
86 { |
81 |
87 ShenandoahWorkerTimingsTracker x(worker_times, ShenandoahPhaseTimings::StringDedupTableRoots, worker_id); |
82 { |
88 StringDedupTable::unlink_or_oops_do(&sd_cl, worker_id); |
83 ShenandoahWorkerTimingsTracker x(worker_times, ShenandoahPhaseTimings::StringDedupQueueRoots, worker_id); |
89 } |
|
90 } else { |
84 StringDedupQueue::unlink_or_oops_do(&sd_cl); |
91 StringDedupQueue::unlink_or_oops_do(&sd_cl); |
85 } |
|
86 { |
|
87 ShenandoahWorkerTimingsTracker x(worker_times, ShenandoahPhaseTimings::StringDedupTableRoots, worker_id); |
|
88 StringDedupTable::unlink_or_oops_do(&sd_cl, worker_id); |
92 StringDedupTable::unlink_or_oops_do(&sd_cl, worker_id); |
89 } |
93 } |
90 } |
94 } |
91 |
95 |
92 void ShenandoahStringDedup::oops_do_slow(OopClosure* cl) { |
96 void ShenandoahStringDedup::oops_do_slow(OopClosure* cl) { |