109 if (code != NULL && !ShenandoahConcurrentScanCodeRoots) {
110 _code_roots.code_blobs_do(code, worker_id);
111 }
112 }
113
114 template <typename ITR>
115 void ShenandoahRootScanner<ITR>::roots_do_unchecked(OopClosure* oops) {
116 CLDToOopClosure clds(oops, ClassLoaderData::_claim_strong);
117 MarkingCodeBlobClosure code(oops, !CodeBlobToOopClosure::FixRelocations);
118 ShenandoahParallelOopsDoThreadClosure tc_cl(oops, &code, NULL);
119 ResourceMark rm;
120
121 _serial_roots.oops_do(oops, 0);
122 _jni_roots.oops_do(oops, 0);
123 _cld_roots.clds_do(&clds, &clds, 0);
124 _thread_roots.threads_do(&tc_cl, 0);
125 _code_roots.code_blobs_do(&code, 0);
126 }
127
128 template <typename ITR>
129 void ShenandoahRootScanner<ITR>::strong_roots_do(uint worker_id, OopClosure* oops, CLDClosure* clds, CodeBlobClosure* code, ThreadClosure* tc) {
130 assert(ShenandoahHeap::heap()->unload_classes(), "Should be used during class unloading");
131 ShenandoahParallelOopsDoThreadClosure tc_cl(oops, code, tc);
132 ResourceMark rm;
133
134 _serial_roots.oops_do(oops, worker_id);
135 _jni_roots.oops_do(oops, worker_id);
136 _cld_roots.clds_do(clds, NULL, worker_id);
137 _thread_roots.threads_do(&tc_cl, worker_id);
138 }
139
140 template <typename IsAlive, typename KeepAlive>
141 void ShenandoahRootUpdater::roots_do(uint worker_id, IsAlive* is_alive, KeepAlive* keep_alive) {
142 CodeBlobToOopClosure update_blobs(keep_alive, CodeBlobToOopClosure::FixRelocations);
143 CLDToOopClosure clds(keep_alive, ClassLoaderData::_claim_strong);
144 CLDToOopClosure* weak_clds = ShenandoahHeap::heap()->unload_classes() ? NULL : &clds;
145
146 _serial_roots.oops_do(keep_alive, worker_id);
147 _jni_roots.oops_do(keep_alive, worker_id);
148
|
109 if (code != NULL && !ShenandoahConcurrentScanCodeRoots) {
110 _code_roots.code_blobs_do(code, worker_id);
111 }
112 }
113
114 template <typename ITR>
115 void ShenandoahRootScanner<ITR>::roots_do_unchecked(OopClosure* oops) {
116 CLDToOopClosure clds(oops, ClassLoaderData::_claim_strong);
117 MarkingCodeBlobClosure code(oops, !CodeBlobToOopClosure::FixRelocations);
118 ShenandoahParallelOopsDoThreadClosure tc_cl(oops, &code, NULL);
119 ResourceMark rm;
120
121 _serial_roots.oops_do(oops, 0);
122 _jni_roots.oops_do(oops, 0);
123 _cld_roots.clds_do(&clds, &clds, 0);
124 _thread_roots.threads_do(&tc_cl, 0);
125 _code_roots.code_blobs_do(&code, 0);
126 }
127
128 template <typename ITR>
129 void ShenandoahRootScanner<ITR>::strong_roots_do_unchecked(OopClosure* oops) {
130 CLDToOopClosure clds(oops, ClassLoaderData::_claim_strong);
131 MarkingCodeBlobClosure code(oops, !CodeBlobToOopClosure::FixRelocations);
132 ShenandoahParallelOopsDoThreadClosure tc_cl(oops, &code, NULL);
133 ResourceMark rm;
134
135 _serial_roots.oops_do(oops, 0);
136 _jni_roots.oops_do(oops, 0);
137 _cld_roots.clds_do(&clds, NULL, 0);
138 _thread_roots.threads_do(&tc_cl, 0);
139 }
140
141 template <typename ITR>
142 void ShenandoahRootScanner<ITR>::strong_roots_do(uint worker_id, OopClosure* oops, CLDClosure* clds, CodeBlobClosure* code, ThreadClosure* tc) {
143 assert(ShenandoahHeap::heap()->unload_classes(), "Should be used during class unloading");
144 ShenandoahParallelOopsDoThreadClosure tc_cl(oops, code, tc);
145 ResourceMark rm;
146
147 _serial_roots.oops_do(oops, worker_id);
148 _jni_roots.oops_do(oops, worker_id);
149 _cld_roots.clds_do(clds, NULL, worker_id);
150 _thread_roots.threads_do(&tc_cl, worker_id);
151 }
152
153 template <typename IsAlive, typename KeepAlive>
154 void ShenandoahRootUpdater::roots_do(uint worker_id, IsAlive* is_alive, KeepAlive* keep_alive) {
155 CodeBlobToOopClosure update_blobs(keep_alive, CodeBlobToOopClosure::FixRelocations);
156 CLDToOopClosure clds(keep_alive, ClassLoaderData::_claim_strong);
157 CLDToOopClosure* weak_clds = ShenandoahHeap::heap()->unload_classes() ? NULL : &clds;
158
159 _serial_roots.oops_do(keep_alive, worker_id);
160 _jni_roots.oops_do(keep_alive, worker_id);
161
|