54 _oops_do(cl);
55 }
56 }
57
58 ShenandoahSerialRoots::ShenandoahSerialRoots() :
59 _universe_root(&Universe::oops_do, ShenandoahPhaseTimings::UniverseRoots),
60 _object_synchronizer_root(&ObjectSynchronizer::oops_do, ShenandoahPhaseTimings::ObjectSynchronizerRoots),
61 _management_root(&Management::oops_do, ShenandoahPhaseTimings::ManagementRoots),
62 _system_dictionary_root(&SystemDictionary::oops_do, ShenandoahPhaseTimings::SystemDictionaryRoots),
63 _jvmti_root(&JvmtiExport::oops_do, ShenandoahPhaseTimings::JVMTIRoots) {
64 }
65
66 void ShenandoahSerialRoots::oops_do(OopClosure* cl, uint worker_id) {
67 _universe_root.oops_do(cl, worker_id);
68 _object_synchronizer_root.oops_do(cl, worker_id);
69 _management_root.oops_do(cl, worker_id);
70 _system_dictionary_root.oops_do(cl, worker_id);
71 _jvmti_root.oops_do(cl, worker_id);
72 }
73
74 ShenandoahJNIHandleRoots::ShenandoahJNIHandleRoots() :
75 ShenandoahSerialRoot(&JNIHandles::oops_do, ShenandoahPhaseTimings::JNIRoots) {
76 }
77
78 ShenandoahThreadRoots::ShenandoahThreadRoots(bool is_par) : _is_par(is_par) {
79 Threads::change_thread_claim_token();
80 }
81
82 void ShenandoahThreadRoots::oops_do(OopClosure* oops_cl, CodeBlobClosure* code_cl, uint worker_id) {
83 ShenandoahWorkerTimings* worker_times = ShenandoahHeap::heap()->phase_timings()->worker_times();
84 ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::ThreadRoots, worker_id);
85 ResourceMark rm;
86 Threads::possibly_parallel_oops_do(_is_par, oops_cl, code_cl);
87 }
88
89 void ShenandoahThreadRoots::threads_do(ThreadClosure* tc, uint worker_id) {
90 ShenandoahWorkerTimings* worker_times = ShenandoahHeap::heap()->phase_timings()->worker_times();
91 ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::ThreadRoots, worker_id);
92 ResourceMark rm;
93 Threads::possibly_parallel_threads_do(_is_par, tc);
94 }
95
96 ShenandoahThreadRoots::~ShenandoahThreadRoots() {
97 Threads::assert_all_threads_claimed();
131 }
132
133 void ShenandoahClassLoaderDataRoots::clds_do(CLDClosure* strong_clds, CLDClosure* weak_clds, uint worker_id) {
134 ShenandoahWorkerTimings* worker_times = ShenandoahHeap::heap()->phase_timings()->worker_times();
135 ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::CLDGRoots, worker_id);
136 ClassLoaderDataGraph::roots_cld_do(strong_clds, weak_clds);
137 }
138
139 ShenandoahRootProcessor::ShenandoahRootProcessor(ShenandoahPhaseTimings::Phase phase) :
140 _heap(ShenandoahHeap::heap()),
141 _phase(phase) {
142 assert(SafepointSynchronize::is_at_safepoint(), "Must at safepoint");
143 _heap->phase_timings()->record_workers_start(_phase);
144 }
145
146 ShenandoahRootProcessor::~ShenandoahRootProcessor() {
147 assert(SafepointSynchronize::is_at_safepoint(), "Must at safepoint");
148 _heap->phase_timings()->record_workers_end(_phase);
149 }
150
151 ShenandoahRootEvacuator::ShenandoahRootEvacuator(uint n_workers, ShenandoahPhaseTimings::Phase phase) :
152 ShenandoahRootProcessor(phase),
153 _thread_roots(n_workers > 1),
154 _weak_roots(n_workers) {
155 }
156
157 void ShenandoahRootEvacuator::roots_do(uint worker_id, OopClosure* oops) {
158 MarkingCodeBlobClosure blobsCl(oops, CodeBlobToOopClosure::FixRelocations);
159 CLDToOopClosure clds(oops, ClassLoaderData::_claim_strong);
160 CLDToOopClosure* weak_clds = ShenandoahHeap::heap()->unload_classes() ? NULL : &clds;
161
162 AlwaysTrueClosure always_true;
163
164 _serial_roots.oops_do(oops, worker_id);
165 _jni_roots.oops_do(oops, worker_id);
166
167 _thread_roots.oops_do(oops, NULL, worker_id);
168 _cld_roots.clds_do(&clds, &clds, worker_id);
169 _code_roots.code_blobs_do(&blobsCl, worker_id);
170
171 _weak_roots.oops_do<AlwaysTrueClosure, OopClosure>(&always_true, oops, worker_id);
172 _dedup_roots.oops_do(&always_true, oops, worker_id);
173 }
174
175 ShenandoahRootUpdater::ShenandoahRootUpdater(uint n_workers, ShenandoahPhaseTimings::Phase phase, bool update_code_cache) :
176 ShenandoahRootProcessor(phase),
177 _thread_roots(n_workers > 1),
178 _weak_roots(n_workers),
179 _update_code_cache(update_code_cache) {
180 }
181
182 ShenandoahRootAdjuster::ShenandoahRootAdjuster(uint n_workers, ShenandoahPhaseTimings::Phase phase) :
183 ShenandoahRootProcessor(phase),
184 _thread_roots(n_workers > 1),
185 _weak_roots(n_workers) {
|
54 _oops_do(cl);
55 }
56 }
57
58 ShenandoahSerialRoots::ShenandoahSerialRoots() :
59 _universe_root(&Universe::oops_do, ShenandoahPhaseTimings::UniverseRoots),
60 _object_synchronizer_root(&ObjectSynchronizer::oops_do, ShenandoahPhaseTimings::ObjectSynchronizerRoots),
61 _management_root(&Management::oops_do, ShenandoahPhaseTimings::ManagementRoots),
62 _system_dictionary_root(&SystemDictionary::oops_do, ShenandoahPhaseTimings::SystemDictionaryRoots),
63 _jvmti_root(&JvmtiExport::oops_do, ShenandoahPhaseTimings::JVMTIRoots) {
64 }
65
66 void ShenandoahSerialRoots::oops_do(OopClosure* cl, uint worker_id) {
67 _universe_root.oops_do(cl, worker_id);
68 _object_synchronizer_root.oops_do(cl, worker_id);
69 _management_root.oops_do(cl, worker_id);
70 _system_dictionary_root.oops_do(cl, worker_id);
71 _jvmti_root.oops_do(cl, worker_id);
72 }
73
74 ShenandoahThreadRoots::ShenandoahThreadRoots(bool is_par) : _is_par(is_par) {
75 Threads::change_thread_claim_token();
76 }
77
78 void ShenandoahThreadRoots::oops_do(OopClosure* oops_cl, CodeBlobClosure* code_cl, uint worker_id) {
79 ShenandoahWorkerTimings* worker_times = ShenandoahHeap::heap()->phase_timings()->worker_times();
80 ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::ThreadRoots, worker_id);
81 ResourceMark rm;
82 Threads::possibly_parallel_oops_do(_is_par, oops_cl, code_cl);
83 }
84
85 void ShenandoahThreadRoots::threads_do(ThreadClosure* tc, uint worker_id) {
86 ShenandoahWorkerTimings* worker_times = ShenandoahHeap::heap()->phase_timings()->worker_times();
87 ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::ThreadRoots, worker_id);
88 ResourceMark rm;
89 Threads::possibly_parallel_threads_do(_is_par, tc);
90 }
91
92 ShenandoahThreadRoots::~ShenandoahThreadRoots() {
93 Threads::assert_all_threads_claimed();
127 }
128
129 void ShenandoahClassLoaderDataRoots::clds_do(CLDClosure* strong_clds, CLDClosure* weak_clds, uint worker_id) {
130 ShenandoahWorkerTimings* worker_times = ShenandoahHeap::heap()->phase_timings()->worker_times();
131 ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::CLDGRoots, worker_id);
132 ClassLoaderDataGraph::roots_cld_do(strong_clds, weak_clds);
133 }
134
135 ShenandoahRootProcessor::ShenandoahRootProcessor(ShenandoahPhaseTimings::Phase phase) :
136 _heap(ShenandoahHeap::heap()),
137 _phase(phase) {
138 assert(SafepointSynchronize::is_at_safepoint(), "Must at safepoint");
139 _heap->phase_timings()->record_workers_start(_phase);
140 }
141
142 ShenandoahRootProcessor::~ShenandoahRootProcessor() {
143 assert(SafepointSynchronize::is_at_safepoint(), "Must at safepoint");
144 _heap->phase_timings()->record_workers_end(_phase);
145 }
146
147 ShenandoahRootEvacuator::ShenandoahRootEvacuator(uint n_workers, ShenandoahPhaseTimings::Phase phase, bool include_concurrent_roots) :
148 ShenandoahRootProcessor(phase),
149 _thread_roots(n_workers > 1),
150 _weak_roots(n_workers),
151 _include_concurrent_roots(include_concurrent_roots) {
152 }
153
154 void ShenandoahRootEvacuator::roots_do(uint worker_id, OopClosure* oops) {
155 MarkingCodeBlobClosure blobsCl(oops, CodeBlobToOopClosure::FixRelocations);
156 CLDToOopClosure clds(oops, ClassLoaderData::_claim_strong);
157 AlwaysTrueClosure always_true;
158
159 _serial_roots.oops_do(oops, worker_id);
160 if (_include_concurrent_roots) {
161 _jni_roots.oops_do<OopClosure>(oops, worker_id);
162 }
163
164 _thread_roots.oops_do(oops, NULL, worker_id);
165 _cld_roots.clds_do(&clds, &clds, worker_id);
166 _code_roots.code_blobs_do(&blobsCl, worker_id);
167
168 _weak_roots.oops_do<AlwaysTrueClosure, OopClosure>(&always_true, oops, worker_id);
169 _dedup_roots.oops_do(&always_true, oops, worker_id);
170 }
171
172 ShenandoahRootUpdater::ShenandoahRootUpdater(uint n_workers, ShenandoahPhaseTimings::Phase phase, bool update_code_cache) :
173 ShenandoahRootProcessor(phase),
174 _thread_roots(n_workers > 1),
175 _weak_roots(n_workers),
176 _update_code_cache(update_code_cache) {
177 }
178
179 ShenandoahRootAdjuster::ShenandoahRootAdjuster(uint n_workers, ShenandoahPhaseTimings::Phase phase) :
180 ShenandoahRootProcessor(phase),
181 _thread_roots(n_workers > 1),
182 _weak_roots(n_workers) {
|