30 class ShenandoahStrDedupQueue;
31
32 enum UpdateRefsMode {
33 NONE, // No reference updating
34 RESOLVE, // Only a read-barrier (no reference updating)
35 SIMPLE, // Reference updating using simple store
36 CONCURRENT // Reference updating using CAS
37 };
38
39 class ShenandoahMarkRefsSuperClosure : public MetadataAwareOopClosure {
40 private:
41 ShenandoahObjToScanQueue* _queue;
42 ShenandoahStrDedupQueue* _dedup_queue;
43 ShenandoahHeap* _heap;
44 public:
45 ShenandoahMarkRefsSuperClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp);
46 ShenandoahMarkRefsSuperClosure(ShenandoahObjToScanQueue* q, ShenandoahStrDedupQueue* dq, ReferenceProcessor* rp);
47
48 template <class T, UpdateRefsMode UPDATE_MODE, bool STRING_DEDUP>
49 void work(T *p);
50 };
51
52 class ShenandoahMarkUpdateRefsClosure : public ShenandoahMarkRefsSuperClosure {
53 public:
54 ShenandoahMarkUpdateRefsClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
55 ShenandoahMarkRefsSuperClosure(q, rp) {};
56
57 template <class T>
58 inline void do_oop_nv(T* p) { work<T, CONCURRENT, false /* string dedup */>(p); }
59 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
60 virtual void do_oop(oop* p) { do_oop_nv(p); }
61 inline bool do_metadata_nv() { return false; }
62 virtual bool do_metadata() { return false; }
63 };
64
65 class ShenandoahMarkUpdateRefsDedupClosure : public ShenandoahMarkRefsSuperClosure {
66 public:
67 ShenandoahMarkUpdateRefsDedupClosure(ShenandoahObjToScanQueue* q, ShenandoahStrDedupQueue* dq, ReferenceProcessor* rp) :
68 ShenandoahMarkRefsSuperClosure(q, dq, rp) {};
69
193 class ShenandoahUpdateHeapRefsClosure : public ShenandoahUpdateHeapRefsSuperClosure {
194 public:
195 ShenandoahUpdateHeapRefsClosure() : ShenandoahUpdateHeapRefsSuperClosure() {}
196
197 template <class T>
198 inline void do_oop_nv(T* p) { work<T, false>(p); }
199 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
200 virtual void do_oop(oop* p) { do_oop_nv(p); }
201 };
202
203 class ShenandoahUpdateHeapRefsMatrixClosure : public ShenandoahUpdateHeapRefsSuperClosure {
204 public:
205 ShenandoahUpdateHeapRefsMatrixClosure() : ShenandoahUpdateHeapRefsSuperClosure() {}
206
207 template <class T>
208 inline void do_oop_nv(T* p) { work<T, true>(p); }
209 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
210 virtual void do_oop(oop* p) { do_oop_nv(p); }
211 };
212
213 class ShenandoahPartialEvacuateUpdateHeapClosure : public ExtendedOopClosure {
214 private:
215 ShenandoahPartialGC* _partial_gc;
216 Thread* _thread;
217 ShenandoahObjToScanQueue* _queue;
218 public:
219 ShenandoahPartialEvacuateUpdateHeapClosure(ShenandoahObjToScanQueue* q) :
220 _partial_gc(ShenandoahHeap::heap()->partial_gc()),
221 _thread(Thread::current()), _queue(q) {}
222
223 template <class T>
224 void do_oop_nv(T* p);
225
226 void do_oop(oop* p) { do_oop_nv(p); }
227 void do_oop(narrowOop* p) { do_oop_nv(p); }
228 };
229
230 class ShenandoahTraversalSuperClosure : public MetadataAwareOopClosure {
231 private:
232 ShenandoahTraversalGC* _traversal_gc;
233 Thread* _thread;
234 ShenandoahObjToScanQueue* _queue;
235 ShenandoahStrDedupQueue* _dedup_queue;
236
237 protected:
238 ShenandoahTraversalSuperClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
239 MetadataAwareOopClosure(rp),
240 _traversal_gc(ShenandoahHeap::heap()->traversal_gc()),
241 _thread(Thread::current()), _queue(q), _dedup_queue(NULL) {
242 }
243
244 ShenandoahTraversalSuperClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp, ShenandoahStrDedupQueue* dq) :
245 MetadataAwareOopClosure(rp),
246 _traversal_gc(ShenandoahHeap::heap()->traversal_gc()),
247 _thread(Thread::current()), _queue(q), _dedup_queue(dq) {
248 }
249
250 template <class T, bool STRING_DEDUP, bool DEGEN>
251 void work(T* p);
252 };
253
254 class ShenandoahTraversalClosure : public ShenandoahTraversalSuperClosure {
255 public:
256 ShenandoahTraversalClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
257 ShenandoahTraversalSuperClosure(q, rp) {}
258
259 template <class T>
260 inline void do_oop_nv(T* p) { work<T, false, false>(p); }
261
262 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
263 virtual void do_oop(oop* p) { do_oop_nv(p); }
264
265 inline bool do_metadata_nv() { return false; }
266 virtual bool do_metadata() { return false; }
267 };
268
269 class ShenandoahTraversalMetadataClosure : public ShenandoahTraversalSuperClosure {
270 public:
271 ShenandoahTraversalMetadataClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
272 ShenandoahTraversalSuperClosure(q, rp) {}
273
274 template <class T>
275 inline void do_oop_nv(T* p) { work<T, false, false>(p); }
276
277 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
278 virtual void do_oop(oop* p) { do_oop_nv(p); }
279
280 inline bool do_metadata_nv() { return true; }
281 virtual bool do_metadata() { return true; }
282 };
283
284 class ShenandoahTraversalDedupClosure : public ShenandoahTraversalSuperClosure {
285 public:
286 ShenandoahTraversalDedupClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp, ShenandoahStrDedupQueue* dq) :
287 ShenandoahTraversalSuperClosure(q, rp, dq) {}
288
289 template <class T>
290 inline void do_oop_nv(T* p) { work<T, true, false>(p); }
291
292 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
293 virtual void do_oop(oop* p) { do_oop_nv(p); }
294
295 inline bool do_metadata_nv() { return false; }
296 virtual bool do_metadata() { return false; }
297 };
298
299 class ShenandoahTraversalMetadataDedupClosure : public ShenandoahTraversalSuperClosure {
300 public:
301 ShenandoahTraversalMetadataDedupClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp, ShenandoahStrDedupQueue* dq) :
302 ShenandoahTraversalSuperClosure(q, rp, dq) {}
303
304 template <class T>
305 inline void do_oop_nv(T* p) { work<T, true, false>(p); }
306
307 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
308 virtual void do_oop(oop* p) { do_oop_nv(p); }
309
310 inline bool do_metadata_nv() { return true; }
311 virtual bool do_metadata() { return true; }
312 };
313
314 class ShenandoahTraversalDegenClosure : public ShenandoahTraversalSuperClosure {
315 public:
316 ShenandoahTraversalDegenClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
317 ShenandoahTraversalSuperClosure(q, rp) {}
318
319 template <class T>
320 inline void do_oop_nv(T* p) { work<T, false, true>(p); }
321
322 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
323 virtual void do_oop(oop* p) { do_oop_nv(p); }
324
325 inline bool do_metadata_nv() { return false; }
326 virtual bool do_metadata() { return false; }
327 };
328
329 class ShenandoahTraversalMetadataDegenClosure : public ShenandoahTraversalSuperClosure {
330 public:
331 ShenandoahTraversalMetadataDegenClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
332 ShenandoahTraversalSuperClosure(q, rp) {}
333
334 template <class T>
335 inline void do_oop_nv(T* p) { work<T, false, true>(p); }
336
337 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
338 virtual void do_oop(oop* p) { do_oop_nv(p); }
339
340 inline bool do_metadata_nv() { return true; }
341 virtual bool do_metadata() { return true; }
342 };
343
344 class ShenandoahTraversalDedupDegenClosure : public ShenandoahTraversalSuperClosure {
345 public:
346 ShenandoahTraversalDedupDegenClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp, ShenandoahStrDedupQueue* dq) :
347 ShenandoahTraversalSuperClosure(q, rp, dq) {}
348
349 template <class T>
350 inline void do_oop_nv(T* p) { work<T, true, true>(p); }
351
352 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
353 virtual void do_oop(oop* p) { do_oop_nv(p); }
354
355 inline bool do_metadata_nv() { return false; }
356 virtual bool do_metadata() { return false; }
357 };
358
359 class ShenandoahTraversalMetadataDedupDegenClosure : public ShenandoahTraversalSuperClosure {
360 public:
361 ShenandoahTraversalMetadataDedupDegenClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp, ShenandoahStrDedupQueue* dq) :
362 ShenandoahTraversalSuperClosure(q, rp, dq) {}
363
364 template <class T>
365 inline void do_oop_nv(T* p) { work<T, true, true>(p); }
366
367 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
368 virtual void do_oop(oop* p) { do_oop_nv(p); }
369
370 inline bool do_metadata_nv() { return true; }
371 virtual bool do_metadata() { return true; }
372 };
373
374 #endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHOOPCLOSURES_HPP
|
30 class ShenandoahStrDedupQueue;
31
32 enum UpdateRefsMode {
33 NONE, // No reference updating
34 RESOLVE, // Only a read-barrier (no reference updating)
35 SIMPLE, // Reference updating using simple store
36 CONCURRENT // Reference updating using CAS
37 };
38
39 class ShenandoahMarkRefsSuperClosure : public MetadataAwareOopClosure {
40 private:
41 ShenandoahObjToScanQueue* _queue;
42 ShenandoahStrDedupQueue* _dedup_queue;
43 ShenandoahHeap* _heap;
44 public:
45 ShenandoahMarkRefsSuperClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp);
46 ShenandoahMarkRefsSuperClosure(ShenandoahObjToScanQueue* q, ShenandoahStrDedupQueue* dq, ReferenceProcessor* rp);
47
48 template <class T, UpdateRefsMode UPDATE_MODE, bool STRING_DEDUP>
49 void work(T *p);
50
51 inline void set_base_object(oop obj) { /* Not needed */ }
52 };
53
54 class ShenandoahMarkUpdateRefsClosure : public ShenandoahMarkRefsSuperClosure {
55 public:
56 ShenandoahMarkUpdateRefsClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
57 ShenandoahMarkRefsSuperClosure(q, rp) {};
58
59 template <class T>
60 inline void do_oop_nv(T* p) { work<T, CONCURRENT, false /* string dedup */>(p); }
61 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
62 virtual void do_oop(oop* p) { do_oop_nv(p); }
63 inline bool do_metadata_nv() { return false; }
64 virtual bool do_metadata() { return false; }
65 };
66
67 class ShenandoahMarkUpdateRefsDedupClosure : public ShenandoahMarkRefsSuperClosure {
68 public:
69 ShenandoahMarkUpdateRefsDedupClosure(ShenandoahObjToScanQueue* q, ShenandoahStrDedupQueue* dq, ReferenceProcessor* rp) :
70 ShenandoahMarkRefsSuperClosure(q, dq, rp) {};
71
195 class ShenandoahUpdateHeapRefsClosure : public ShenandoahUpdateHeapRefsSuperClosure {
196 public:
197 ShenandoahUpdateHeapRefsClosure() : ShenandoahUpdateHeapRefsSuperClosure() {}
198
199 template <class T>
200 inline void do_oop_nv(T* p) { work<T, false>(p); }
201 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
202 virtual void do_oop(oop* p) { do_oop_nv(p); }
203 };
204
205 class ShenandoahUpdateHeapRefsMatrixClosure : public ShenandoahUpdateHeapRefsSuperClosure {
206 public:
207 ShenandoahUpdateHeapRefsMatrixClosure() : ShenandoahUpdateHeapRefsSuperClosure() {}
208
209 template <class T>
210 inline void do_oop_nv(T* p) { work<T, true>(p); }
211 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
212 virtual void do_oop(oop* p) { do_oop_nv(p); }
213 };
214
215 class ShenandoahTraversalSuperClosure : public MetadataAwareOopClosure {
216 private:
217 ShenandoahTraversalGC* _traversal_gc;
218 Thread* _thread;
219 ShenandoahObjToScanQueue* _queue;
220 ShenandoahStrDedupQueue* _dedup_queue;
221 oop _base_obj;
222 protected:
223 ShenandoahTraversalSuperClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
224 MetadataAwareOopClosure(rp),
225 _traversal_gc(ShenandoahHeap::heap()->traversal_gc()),
226 _thread(Thread::current()), _queue(q), _dedup_queue(NULL), _base_obj(NULL) {
227 }
228
229 ShenandoahTraversalSuperClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp, ShenandoahStrDedupQueue* dq) :
230 MetadataAwareOopClosure(rp),
231 _traversal_gc(ShenandoahHeap::heap()->traversal_gc()),
232 _thread(Thread::current()), _queue(q), _dedup_queue(dq) {
233 }
234
235 template <class T, bool STRING_DEDUP, bool DEGEN, bool MATRIX>
236 void work(T* p);
237
238 public:
239 inline void set_base_object(oop obj) {
240 _base_obj = obj;
241 }
242 };
243
244 class ShenandoahTraversalClosure : public ShenandoahTraversalSuperClosure {
245 public:
246 ShenandoahTraversalClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
247 ShenandoahTraversalSuperClosure(q, rp) {}
248
249 template <class T>
250 inline void do_oop_nv(T* p) { work<T, false, false, false>(p); }
251
252 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
253 virtual void do_oop(oop* p) { do_oop_nv(p); }
254
255 inline bool do_metadata_nv() { return false; }
256 virtual bool do_metadata() { return false; }
257 };
258
259 class ShenandoahTraversalMetadataClosure : public ShenandoahTraversalSuperClosure {
260 public:
261 ShenandoahTraversalMetadataClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
262 ShenandoahTraversalSuperClosure(q, rp) {}
263
264 template <class T>
265 inline void do_oop_nv(T* p) { work<T, false, false, false>(p); }
266
267 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
268 virtual void do_oop(oop* p) { do_oop_nv(p); }
269
270 inline bool do_metadata_nv() { return true; }
271 virtual bool do_metadata() { return true; }
272 };
273
274 class ShenandoahTraversalDedupClosure : public ShenandoahTraversalSuperClosure {
275 public:
276 ShenandoahTraversalDedupClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp, ShenandoahStrDedupQueue* dq) :
277 ShenandoahTraversalSuperClosure(q, rp, dq) {}
278
279 template <class T>
280 inline void do_oop_nv(T* p) { work<T, true, false, false>(p); }
281
282 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
283 virtual void do_oop(oop* p) { do_oop_nv(p); }
284
285 inline bool do_metadata_nv() { return false; }
286 virtual bool do_metadata() { return false; }
287 };
288
289 class ShenandoahTraversalMetadataDedupClosure : public ShenandoahTraversalSuperClosure {
290 public:
291 ShenandoahTraversalMetadataDedupClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp, ShenandoahStrDedupQueue* dq) :
292 ShenandoahTraversalSuperClosure(q, rp, dq) {}
293
294 template <class T>
295 inline void do_oop_nv(T* p) { work<T, true, false, false>(p); }
296
297 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
298 virtual void do_oop(oop* p) { do_oop_nv(p); }
299
300 inline bool do_metadata_nv() { return true; }
301 virtual bool do_metadata() { return true; }
302 };
303
304 class ShenandoahTraversalDegenClosure : public ShenandoahTraversalSuperClosure {
305 public:
306 ShenandoahTraversalDegenClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
307 ShenandoahTraversalSuperClosure(q, rp) {}
308
309 template <class T>
310 inline void do_oop_nv(T* p) { work<T, false, true, false>(p); }
311
312 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
313 virtual void do_oop(oop* p) { do_oop_nv(p); }
314
315 inline bool do_metadata_nv() { return false; }
316 virtual bool do_metadata() { return false; }
317 };
318
319 class ShenandoahTraversalMetadataDegenClosure : public ShenandoahTraversalSuperClosure {
320 public:
321 ShenandoahTraversalMetadataDegenClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
322 ShenandoahTraversalSuperClosure(q, rp) {}
323
324 template <class T>
325 inline void do_oop_nv(T* p) { work<T, false, true, false>(p); }
326
327 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
328 virtual void do_oop(oop* p) { do_oop_nv(p); }
329
330 inline bool do_metadata_nv() { return true; }
331 virtual bool do_metadata() { return true; }
332 };
333
334 class ShenandoahTraversalDedupDegenClosure : public ShenandoahTraversalSuperClosure {
335 public:
336 ShenandoahTraversalDedupDegenClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp, ShenandoahStrDedupQueue* dq) :
337 ShenandoahTraversalSuperClosure(q, rp, dq) {}
338
339 template <class T>
340 inline void do_oop_nv(T* p) { work<T, true, true, false>(p); }
341
342 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
343 virtual void do_oop(oop* p) { do_oop_nv(p); }
344
345 inline bool do_metadata_nv() { return false; }
346 virtual bool do_metadata() { return false; }
347 };
348
349 class ShenandoahTraversalMetadataDedupDegenClosure : public ShenandoahTraversalSuperClosure {
350 public:
351 ShenandoahTraversalMetadataDedupDegenClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp, ShenandoahStrDedupQueue* dq) :
352 ShenandoahTraversalSuperClosure(q, rp, dq) {}
353
354 template <class T>
355 inline void do_oop_nv(T* p) { work<T, true, true, false>(p); }
356
357 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
358 virtual void do_oop(oop* p) { do_oop_nv(p); }
359
360 inline bool do_metadata_nv() { return true; }
361 virtual bool do_metadata() { return true; }
362 };
363
364 class ShenandoahTraversalMatrixClosure : public ShenandoahTraversalSuperClosure {
365 public:
366 ShenandoahTraversalMatrixClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
367 ShenandoahTraversalSuperClosure(q, rp) {}
368
369 template <class T>
370 inline void do_oop_nv(T* p) { work<T, false, false, true>(p); }
371
372 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
373 virtual void do_oop(oop* p) { do_oop_nv(p); }
374
375 inline bool do_metadata_nv() { return false; }
376 virtual bool do_metadata() { return false; }
377 };
378
379 class ShenandoahTraversalMetadataMatrixClosure : public ShenandoahTraversalSuperClosure {
380 public:
381 ShenandoahTraversalMetadataMatrixClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
382 ShenandoahTraversalSuperClosure(q, rp) {}
383
384 template <class T>
385 inline void do_oop_nv(T* p) { work<T, false, false, true>(p); }
386
387 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
388 virtual void do_oop(oop* p) { do_oop_nv(p); }
389
390 inline bool do_metadata_nv() { return true; }
391 virtual bool do_metadata() { return true; }
392 };
393
394 class ShenandoahTraversalDedupMatrixClosure : public ShenandoahTraversalSuperClosure {
395 public:
396 ShenandoahTraversalDedupMatrixClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp, ShenandoahStrDedupQueue* dq) :
397 ShenandoahTraversalSuperClosure(q, rp, dq) {}
398
399 template <class T>
400 inline void do_oop_nv(T* p) { work<T, true, false, true>(p); }
401
402 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
403 virtual void do_oop(oop* p) { do_oop_nv(p); }
404
405 inline bool do_metadata_nv() { return false; }
406 virtual bool do_metadata() { return false; }
407 };
408
409 class ShenandoahTraversalMetadataDedupMatrixClosure : public ShenandoahTraversalSuperClosure {
410 public:
411 ShenandoahTraversalMetadataDedupMatrixClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp, ShenandoahStrDedupQueue* dq) :
412 ShenandoahTraversalSuperClosure(q, rp, dq) {}
413
414 template <class T>
415 inline void do_oop_nv(T* p) { work<T, true, false, true>(p); }
416
417 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
418 virtual void do_oop(oop* p) { do_oop_nv(p); }
419
420 inline bool do_metadata_nv() { return true; }
421 virtual bool do_metadata() { return true; }
422 };
423
424 class ShenandoahTraversalDegenMatrixClosure : public ShenandoahTraversalSuperClosure {
425 public:
426 ShenandoahTraversalDegenMatrixClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
427 ShenandoahTraversalSuperClosure(q, rp) {}
428
429 template <class T>
430 inline void do_oop_nv(T* p) { work<T, false, true, true>(p); }
431
432 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
433 virtual void do_oop(oop* p) { do_oop_nv(p); }
434
435 inline bool do_metadata_nv() { return false; }
436 virtual bool do_metadata() { return false; }
437 };
438
439 class ShenandoahTraversalMetadataDegenMatrixClosure : public ShenandoahTraversalSuperClosure {
440 public:
441 ShenandoahTraversalMetadataDegenMatrixClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
442 ShenandoahTraversalSuperClosure(q, rp) {}
443
444 template <class T>
445 inline void do_oop_nv(T* p) { work<T, false, true, true>(p); }
446
447 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
448 virtual void do_oop(oop* p) { do_oop_nv(p); }
449
450 inline bool do_metadata_nv() { return true; }
451 virtual bool do_metadata() { return true; }
452 };
453
454 class ShenandoahTraversalDedupDegenMatrixClosure : public ShenandoahTraversalSuperClosure {
455 public:
456 ShenandoahTraversalDedupDegenMatrixClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp, ShenandoahStrDedupQueue* dq) :
457 ShenandoahTraversalSuperClosure(q, rp, dq) {}
458
459 template <class T>
460 inline void do_oop_nv(T* p) { work<T, true, true, true>(p); }
461
462 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
463 virtual void do_oop(oop* p) { do_oop_nv(p); }
464
465 inline bool do_metadata_nv() { return false; }
466 virtual bool do_metadata() { return false; }
467 };
468
469 class ShenandoahTraversalMetadataDedupDegenMatrixClosure : public ShenandoahTraversalSuperClosure {
470 public:
471 ShenandoahTraversalMetadataDedupDegenMatrixClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp, ShenandoahStrDedupQueue* dq) :
472 ShenandoahTraversalSuperClosure(q, rp, dq) {}
473
474 template <class T>
475 inline void do_oop_nv(T* p) { work<T, true, true, true>(p); }
476
477 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
478 virtual void do_oop(oop* p) { do_oop_nv(p); }
479
480 inline bool do_metadata_nv() { return true; }
481 virtual bool do_metadata() { return true; }
482 };
483
484 #endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHOOPCLOSURES_HPP
|