< prev index next >

src/hotspot/share/gc/shenandoah/shenandoahOopClosures.hpp

Print this page
rev 50076 : Fold Partial GC into Traversal GC


  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
< prev index next >