210 }
211
212 _cm->concurrent_scan_code_roots(worker_id, rp);
213 _cm->mark_loop(worker_id, _terminator, rp,
214 true, // cancellable
215 ShenandoahStringDedup::is_enabled()); // perform string dedup
216 }
217 };
218
219 class ShenandoahSATBThreadsClosure : public ThreadClosure {
220 private:
221 ShenandoahSATBBufferClosure* _satb_cl;
222 int _thread_parity;
223
224 public:
225 ShenandoahSATBThreadsClosure(ShenandoahSATBBufferClosure* satb_cl) :
226 _satb_cl(satb_cl),
227 _thread_parity(Threads::thread_claim_parity()) {}
228
229 void do_thread(Thread* thread) {
230 if (thread->is_Java_thread()) {
231 if (thread->claim_oops_do(true, _thread_parity)) {
232 JavaThread* jt = (JavaThread*)thread;
233 ShenandoahThreadLocalData::satb_mark_queue(jt).apply_closure_and_empty(_satb_cl);
234 }
235 } else if (thread->is_VM_thread()) {
236 if (thread->claim_oops_do(true, _thread_parity)) {
237 ShenandoahBarrierSet::satb_mark_queue_set().shared_satb_queue()->apply_closure_and_empty(_satb_cl);
238 }
239 }
240 }
241 };
242
243 class ShenandoahFinalMarkingTask : public AbstractGangTask {
244 private:
245 ShenandoahConcurrentMark* _cm;
246 ShenandoahTaskTerminator* _terminator;
247 bool _dedup_string;
248
249 public:
250 ShenandoahFinalMarkingTask(ShenandoahConcurrentMark* cm, ShenandoahTaskTerminator* terminator, bool dedup_string) :
251 AbstractGangTask("Shenandoah Final Marking"), _cm(cm), _terminator(terminator), _dedup_string(dedup_string) {
252 }
253
254 void work(uint worker_id) {
255 ShenandoahHeap* heap = ShenandoahHeap::heap();
256
257 ShenandoahParallelWorkerSession worker_session(worker_id);
258 // First drain remaining SATB buffers.
|
210 }
211
212 _cm->concurrent_scan_code_roots(worker_id, rp);
213 _cm->mark_loop(worker_id, _terminator, rp,
214 true, // cancellable
215 ShenandoahStringDedup::is_enabled()); // perform string dedup
216 }
217 };
218
219 class ShenandoahSATBThreadsClosure : public ThreadClosure {
220 private:
221 ShenandoahSATBBufferClosure* _satb_cl;
222 int _thread_parity;
223
224 public:
225 ShenandoahSATBThreadsClosure(ShenandoahSATBBufferClosure* satb_cl) :
226 _satb_cl(satb_cl),
227 _thread_parity(Threads::thread_claim_parity()) {}
228
229 void do_thread(Thread* thread) {
230 if (thread->claim_oops_do(true, _thread_parity)) {
231 ShenandoahThreadLocalData::satb_mark_queue(thread).apply_closure_and_empty(_satb_cl);
232 }
233 }
234 };
235
236 class ShenandoahFinalMarkingTask : public AbstractGangTask {
237 private:
238 ShenandoahConcurrentMark* _cm;
239 ShenandoahTaskTerminator* _terminator;
240 bool _dedup_string;
241
242 public:
243 ShenandoahFinalMarkingTask(ShenandoahConcurrentMark* cm, ShenandoahTaskTerminator* terminator, bool dedup_string) :
244 AbstractGangTask("Shenandoah Final Marking"), _cm(cm), _terminator(terminator), _dedup_string(dedup_string) {
245 }
246
247 void work(uint worker_id) {
248 ShenandoahHeap* heap = ShenandoahHeap::heap();
249
250 ShenandoahParallelWorkerSession worker_session(worker_id);
251 // First drain remaining SATB buffers.
|