212 _thread(Thread::current()), |
212 _thread(Thread::current()), |
213 _queue(q), |
213 _queue(q), |
214 _mark_context(ShenandoahHeap::heap()->marking_context()) { |
214 _mark_context(ShenandoahHeap::heap()->marking_context()) { |
215 } |
215 } |
216 |
216 |
217 template <class T, bool STRING_DEDUP, bool DEGEN> |
217 template <class T, bool STRING_DEDUP, bool DEGEN, bool ATOMIC_UPDATE> |
218 void work(T* p); |
218 void work(T* p); |
219 |
219 |
220 }; |
220 }; |
221 |
221 |
|
222 class ShenandoahTraversalRootsClosure : public ShenandoahTraversalSuperClosure { |
|
223 private: |
|
224 template <class T> |
|
225 inline void do_oop_work(T* p) { work<T, false, false, false>(p); } |
|
226 |
|
227 public: |
|
228 ShenandoahTraversalRootsClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) : |
|
229 ShenandoahTraversalSuperClosure(q, rp) {} |
|
230 |
|
231 virtual void do_oop(narrowOop* p) { do_oop_work(p); } |
|
232 virtual void do_oop(oop* p) { do_oop_work(p); } |
|
233 |
|
234 virtual bool do_metadata() { return false; } |
|
235 }; |
|
236 |
222 class ShenandoahTraversalClosure : public ShenandoahTraversalSuperClosure { |
237 class ShenandoahTraversalClosure : public ShenandoahTraversalSuperClosure { |
223 private: |
238 private: |
224 template <class T> |
239 template <class T> |
225 inline void do_oop_work(T* p) { work<T, false, false>(p); } |
240 inline void do_oop_work(T* p) { work<T, false, false, true>(p); } |
226 |
241 |
227 public: |
242 public: |
228 ShenandoahTraversalClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) : |
243 ShenandoahTraversalClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) : |
229 ShenandoahTraversalSuperClosure(q, rp) {} |
244 ShenandoahTraversalSuperClosure(q, rp) {} |
230 |
245 |
235 }; |
250 }; |
236 |
251 |
237 class ShenandoahTraversalMetadataClosure : public ShenandoahTraversalSuperClosure { |
252 class ShenandoahTraversalMetadataClosure : public ShenandoahTraversalSuperClosure { |
238 private: |
253 private: |
239 template <class T> |
254 template <class T> |
240 inline void do_oop_work(T* p) { work<T, false, false>(p); } |
255 inline void do_oop_work(T* p) { work<T, false, false, true>(p); } |
241 |
256 |
242 public: |
257 public: |
243 ShenandoahTraversalMetadataClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) : |
258 ShenandoahTraversalMetadataClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) : |
244 ShenandoahTraversalSuperClosure(q, rp) {} |
259 ShenandoahTraversalSuperClosure(q, rp) {} |
245 |
260 |
250 }; |
265 }; |
251 |
266 |
252 class ShenandoahTraversalDedupClosure : public ShenandoahTraversalSuperClosure { |
267 class ShenandoahTraversalDedupClosure : public ShenandoahTraversalSuperClosure { |
253 private: |
268 private: |
254 template <class T> |
269 template <class T> |
255 inline void do_oop_work(T* p) { work<T, true, false>(p); } |
270 inline void do_oop_work(T* p) { work<T, true, false, true>(p); } |
256 |
271 |
257 public: |
272 public: |
258 ShenandoahTraversalDedupClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) : |
273 ShenandoahTraversalDedupClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) : |
259 ShenandoahTraversalSuperClosure(q, rp) {} |
274 ShenandoahTraversalSuperClosure(q, rp) {} |
260 |
275 |
265 }; |
280 }; |
266 |
281 |
267 class ShenandoahTraversalMetadataDedupClosure : public ShenandoahTraversalSuperClosure { |
282 class ShenandoahTraversalMetadataDedupClosure : public ShenandoahTraversalSuperClosure { |
268 private: |
283 private: |
269 template <class T> |
284 template <class T> |
270 inline void do_oop_work(T* p) { work<T, true, false>(p); } |
285 inline void do_oop_work(T* p) { work<T, true, false, true>(p); } |
271 |
286 |
272 public: |
287 public: |
273 ShenandoahTraversalMetadataDedupClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) : |
288 ShenandoahTraversalMetadataDedupClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) : |
274 ShenandoahTraversalSuperClosure(q, rp) {} |
289 ShenandoahTraversalSuperClosure(q, rp) {} |
275 |
290 |
280 }; |
295 }; |
281 |
296 |
282 class ShenandoahTraversalDegenClosure : public ShenandoahTraversalSuperClosure { |
297 class ShenandoahTraversalDegenClosure : public ShenandoahTraversalSuperClosure { |
283 private: |
298 private: |
284 template <class T> |
299 template <class T> |
285 inline void do_oop_work(T* p) { work<T, false, true>(p); } |
300 inline void do_oop_work(T* p) { work<T, false, true, false>(p); } |
286 |
301 |
287 public: |
302 public: |
288 ShenandoahTraversalDegenClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) : |
303 ShenandoahTraversalDegenClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) : |
289 ShenandoahTraversalSuperClosure(q, rp) {} |
304 ShenandoahTraversalSuperClosure(q, rp) {} |
290 |
305 |
295 }; |
310 }; |
296 |
311 |
297 class ShenandoahTraversalMetadataDegenClosure : public ShenandoahTraversalSuperClosure { |
312 class ShenandoahTraversalMetadataDegenClosure : public ShenandoahTraversalSuperClosure { |
298 private: |
313 private: |
299 template <class T> |
314 template <class T> |
300 inline void do_oop_work(T* p) { work<T, false, true>(p); } |
315 inline void do_oop_work(T* p) { work<T, false, true, false>(p); } |
301 |
316 |
302 public: |
317 public: |
303 ShenandoahTraversalMetadataDegenClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) : |
318 ShenandoahTraversalMetadataDegenClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) : |
304 ShenandoahTraversalSuperClosure(q, rp) {} |
319 ShenandoahTraversalSuperClosure(q, rp) {} |
305 |
320 |
310 }; |
325 }; |
311 |
326 |
312 class ShenandoahTraversalDedupDegenClosure : public ShenandoahTraversalSuperClosure { |
327 class ShenandoahTraversalDedupDegenClosure : public ShenandoahTraversalSuperClosure { |
313 private: |
328 private: |
314 template <class T> |
329 template <class T> |
315 inline void do_oop_work(T* p) { work<T, true, true>(p); } |
330 inline void do_oop_work(T* p) { work<T, true, true, false>(p); } |
316 |
331 |
317 public: |
332 public: |
318 ShenandoahTraversalDedupDegenClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) : |
333 ShenandoahTraversalDedupDegenClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) : |
319 ShenandoahTraversalSuperClosure(q, rp) {} |
334 ShenandoahTraversalSuperClosure(q, rp) {} |
320 |
335 |
325 }; |
340 }; |
326 |
341 |
327 class ShenandoahTraversalMetadataDedupDegenClosure : public ShenandoahTraversalSuperClosure { |
342 class ShenandoahTraversalMetadataDedupDegenClosure : public ShenandoahTraversalSuperClosure { |
328 private: |
343 private: |
329 template <class T> |
344 template <class T> |
330 inline void do_oop_work(T* p) { work<T, true, true>(p); } |
345 inline void do_oop_work(T* p) { work<T, true, true, false>(p); } |
331 |
346 |
332 public: |
347 public: |
333 ShenandoahTraversalMetadataDedupDegenClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) : |
348 ShenandoahTraversalMetadataDedupDegenClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) : |
334 ShenandoahTraversalSuperClosure(q, rp) {} |
349 ShenandoahTraversalSuperClosure(q, rp) {} |
335 |
350 |