1 /*
   2  * Copyright (c) 2015, Red Hat, Inc. and/or its affiliates.
   3  *
   4  * This code is free software; you can redistribute it and/or modify it
   5  * under the terms of the GNU General Public License version 2 only, as
   6  * published by the Free Software Foundation.
   7  *
   8  * This code is distributed in the hope that it will be useful, but WITHOUT
   9  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  10  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  11  * version 2 for more details (a copy is included in the LICENSE file that
  12  * accompanied this code).
  13  *
  14  * You should have received a copy of the GNU General Public License version
  15  * 2 along with this work; if not, write to the Free Software Foundation,
  16  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  17  *
  18  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  19  * or visit www.oracle.com if you need additional information or have any
  20  * questions.
  21  *
  22  */
  23 
  24 #ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHOOPCLOSURES_HPP
  25 #define SHARE_VM_GC_SHENANDOAH_SHENANDOAHOOPCLOSURES_HPP
  26 
  27 #include "gc/shenandoah/shenandoahTaskqueue.hpp"
  28 
  29 class ShenandoahHeap;
  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 MetadataVisitingOopIterateClosure {
  40 private:
  41   ShenandoahObjToScanQueue* _queue;
  42   ShenandoahHeap* _heap;
  43   ShenandoahMarkingContext* const _mark_context;
  44 
  45 protected:
  46   template <class T, UpdateRefsMode UPDATE_MODE, bool STRING_DEDUP>
  47   void work(T *p);
  48 
  49 public:
  50   ShenandoahMarkRefsSuperClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp);
  51 
  52   inline void set_base_object(oop obj) { /* Not needed */ }
  53 };
  54 
  55 class ShenandoahMarkUpdateRefsClosure : public ShenandoahMarkRefsSuperClosure {
  56 private:
  57   template <class T>
  58   inline void do_oop_work(T* p)     { work<T, CONCURRENT, false /* string dedup */>(p); }
  59 
  60 public:
  61   ShenandoahMarkUpdateRefsClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
  62           ShenandoahMarkRefsSuperClosure(q, rp) {};
  63 
  64   virtual void do_oop(narrowOop* p) { do_oop_work(p); }
  65   virtual void do_oop(oop* p)       { do_oop_work(p); }
  66   virtual bool do_metadata()        { return false; }
  67 };
  68 
  69 class ShenandoahMarkUpdateRefsDedupClosure : public ShenandoahMarkRefsSuperClosure {
  70 private:
  71   template <class T>
  72   inline void do_oop_work(T* p)     { work<T, CONCURRENT, true /* string dedup */>(p); }
  73 
  74 public:
  75   ShenandoahMarkUpdateRefsDedupClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
  76           ShenandoahMarkRefsSuperClosure(q, rp) {};
  77 
  78   virtual void do_oop(narrowOop* p) { do_oop_work(p); }
  79   virtual void do_oop(oop* p)       { do_oop_work(p); }
  80   virtual bool do_metadata()        { return false; }
  81 };
  82 
  83 class ShenandoahMarkUpdateRefsMetadataClosure : public ShenandoahMarkRefsSuperClosure {
  84 private:
  85   template <class T>
  86   inline void do_oop_work(T* p)     { work<T, CONCURRENT, false /* string dedup */>(p); }
  87 
  88 public:
  89   ShenandoahMarkUpdateRefsMetadataClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
  90     ShenandoahMarkRefsSuperClosure(q, rp) {};
  91 
  92   virtual void do_oop(narrowOop* p) { do_oop_work(p); }
  93   virtual void do_oop(oop* p)       { do_oop_work(p); }
  94   virtual bool do_metadata()        { return true; }
  95 };
  96 
  97 class ShenandoahMarkUpdateRefsMetadataDedupClosure : public ShenandoahMarkRefsSuperClosure {
  98 private:
  99   template <class T>
 100   inline void do_oop_work(T* p)     { work<T, CONCURRENT, true /* string dedup */>(p); }
 101 
 102 public:
 103   ShenandoahMarkUpdateRefsMetadataDedupClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
 104   ShenandoahMarkRefsSuperClosure(q, rp) {};
 105 
 106   virtual void do_oop(narrowOop* p) { do_oop_work(p); }
 107   virtual void do_oop(oop* p)       { do_oop_work(p); }
 108   virtual bool do_metadata()        { return true; }
 109 };
 110 
 111 class ShenandoahMarkRefsClosure : public ShenandoahMarkRefsSuperClosure {
 112 private:
 113   template <class T>
 114   inline void do_oop_work(T* p)     { work<T, NONE, false /* string dedup */>(p); }
 115 
 116 public:
 117   ShenandoahMarkRefsClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
 118     ShenandoahMarkRefsSuperClosure(q, rp) {};
 119 
 120   virtual void do_oop(narrowOop* p) { do_oop_work(p); }
 121   virtual void do_oop(oop* p)       { do_oop_work(p); }
 122   virtual bool do_metadata()        { return false; }
 123 };
 124 
 125 class ShenandoahMarkRefsDedupClosure : public ShenandoahMarkRefsSuperClosure {
 126 private:
 127   template <class T>
 128   inline void do_oop_work(T* p)     { work<T, NONE, true /* string dedup */>(p); }
 129 
 130 public:
 131   ShenandoahMarkRefsDedupClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
 132     ShenandoahMarkRefsSuperClosure(q, rp) {};
 133 
 134   virtual void do_oop(narrowOop* p) { do_oop_work(p); }
 135   virtual void do_oop(oop* p)       { do_oop_work(p); }
 136   virtual bool do_metadata()        { return false; }
 137 };
 138 
 139 class ShenandoahMarkResolveRefsClosure : public ShenandoahMarkRefsSuperClosure {
 140 private:
 141   template <class T>
 142   inline void do_oop_work(T* p)     { work<T, RESOLVE, false /* string dedup */>(p); }
 143 
 144 public:
 145   ShenandoahMarkResolveRefsClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
 146     ShenandoahMarkRefsSuperClosure(q, rp) {};
 147 
 148   virtual void do_oop(narrowOop* p) { do_oop_work(p); }
 149   virtual void do_oop(oop* p)       { do_oop_work(p); }
 150   virtual bool do_metadata()        { return false; }
 151 };
 152 
 153 class ShenandoahMarkResolveRefsDedupClosure : public ShenandoahMarkRefsSuperClosure {
 154 private:
 155   template <class T>
 156   inline void do_oop_work(T* p)     { work<T, RESOLVE, true /* string dedup */>(p); }
 157 
 158 public:
 159   ShenandoahMarkResolveRefsDedupClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
 160     ShenandoahMarkRefsSuperClosure(q, rp) {};
 161 
 162   virtual void do_oop(narrowOop* p) { do_oop_work(p); }
 163   virtual void do_oop(oop* p)       { do_oop_work(p); }
 164   virtual bool do_metadata()        { return false; }
 165 };
 166 
 167 class ShenandoahMarkRefsMetadataClosure : public ShenandoahMarkRefsSuperClosure {
 168 private:
 169   template <class T>
 170   inline void do_oop_work(T* p)     { work<T, NONE, false /* string dedup */>(p); }
 171 
 172 public:
 173   ShenandoahMarkRefsMetadataClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
 174     ShenandoahMarkRefsSuperClosure(q, rp) {};
 175 
 176   virtual void do_oop(narrowOop* p) { do_oop_work(p); }
 177   virtual void do_oop(oop* p)       { do_oop_work(p); }
 178   virtual bool do_metadata()        { return true; }
 179 };
 180 
 181 class ShenandoahMarkRefsMetadataDedupClosure : public ShenandoahMarkRefsSuperClosure {
 182 private:
 183   template <class T>
 184   inline void do_oop_work(T* p)     { work<T, NONE, true /* string dedup */>(p); }
 185 
 186 public:
 187   ShenandoahMarkRefsMetadataDedupClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
 188     ShenandoahMarkRefsSuperClosure(q, rp) {};
 189 
 190   virtual void do_oop(narrowOop* p) { do_oop_work(p); }
 191   virtual void do_oop(oop* p)       { do_oop_work(p); }
 192   virtual bool do_metadata()        { return true; }
 193 };
 194 
 195 class ShenandoahUpdateHeapRefsSuperClosure : public BasicOopIterateClosure {
 196 private:
 197   ShenandoahHeap* _heap;
 198 public:
 199   ShenandoahUpdateHeapRefsSuperClosure() :
 200     _heap(ShenandoahHeap::heap()) {}
 201 
 202   template <class T, bool UPDATE_MATRIX>
 203   void work(T *p);
 204 };
 205 
 206 class ShenandoahUpdateHeapRefsClosure : public ShenandoahUpdateHeapRefsSuperClosure {
 207 private:
 208   template <class T>
 209   inline  void do_oop_work(T* p)    { work<T, false>(p); }
 210 
 211 public:
 212   ShenandoahUpdateHeapRefsClosure() : ShenandoahUpdateHeapRefsSuperClosure() {}
 213 
 214   virtual void do_oop(narrowOop* p) { do_oop_work(p); }
 215   virtual void do_oop(oop* p)       { do_oop_work(p); }
 216 };
 217 
 218 class ShenandoahUpdateHeapRefsMatrixClosure : public ShenandoahUpdateHeapRefsSuperClosure {
 219 public:
 220   ShenandoahUpdateHeapRefsMatrixClosure() : ShenandoahUpdateHeapRefsSuperClosure() {}
 221 
 222   template <class T>
 223   inline  void do_oop_work(T* p)    { work<T, true>(p); }
 224   virtual void do_oop(narrowOop* p) { do_oop_work(p); }
 225   virtual void do_oop(oop* p)       { do_oop_work(p); }
 226 };
 227 
 228 class ShenandoahTraversalSuperClosure : public MetadataVisitingOopIterateClosure {
 229 private:
 230   ShenandoahTraversalGC* const _traversal_gc;
 231   Thread* const _thread;
 232   ShenandoahObjToScanQueue* const _queue;
 233   ShenandoahMarkingContext* const _mark_context;
 234   oop _base_obj;
 235 protected:
 236   ShenandoahTraversalSuperClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
 237     MetadataVisitingOopIterateClosure(rp),
 238     _traversal_gc(ShenandoahHeap::heap()->traversal_gc()),
 239     _thread(Thread::current()), _queue(q),
 240     _mark_context(ShenandoahHeap::heap()->next_marking_context()),
 241     _base_obj(NULL) {
 242   }
 243 
 244   template <class T, bool STRING_DEDUP, bool DEGEN, bool MATRIX>
 245   void work(T* p);
 246 
 247 public:
 248   inline void set_base_object(oop obj) {
 249     _base_obj = obj;
 250   }
 251 };
 252 
 253 class ShenandoahTraversalClosure : public ShenandoahTraversalSuperClosure {
 254 private:
 255   template <class T>
 256   inline void do_oop_work(T* p)     { work<T, false, false, false>(p); }
 257 
 258 public:
 259   ShenandoahTraversalClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
 260     ShenandoahTraversalSuperClosure(q, rp) {}
 261 
 262   virtual void do_oop(narrowOop* p) { do_oop_work(p); }
 263   virtual void do_oop(oop* p)       { do_oop_work(p); }
 264 
 265   virtual bool do_metadata()        { return false; }
 266 };
 267 
 268 class ShenandoahTraversalMetadataClosure : public ShenandoahTraversalSuperClosure {
 269 private:
 270   template <class T>
 271   inline void do_oop_work(T* p)     { work<T, false, false, false>(p); }
 272 
 273 public:
 274   ShenandoahTraversalMetadataClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
 275     ShenandoahTraversalSuperClosure(q, rp) {}
 276 
 277   virtual void do_oop(narrowOop* p) { do_oop_work(p); }
 278   virtual void do_oop(oop* p)       { do_oop_work(p); }
 279 
 280   virtual bool do_metadata()        { return true; }
 281 };
 282 
 283 class ShenandoahTraversalDedupClosure : public ShenandoahTraversalSuperClosure {
 284 private:
 285   template <class T>
 286   inline void do_oop_work(T* p)     { work<T, true, false, false>(p); }
 287 
 288 public:
 289   ShenandoahTraversalDedupClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
 290     ShenandoahTraversalSuperClosure(q, rp) {}
 291 
 292   virtual void do_oop(narrowOop* p) { do_oop_work(p); }
 293   virtual void do_oop(oop* p)       { do_oop_work(p); }
 294 
 295   virtual bool do_metadata()        { return false; }
 296 };
 297 
 298 class ShenandoahTraversalMetadataDedupClosure : public ShenandoahTraversalSuperClosure {
 299 private:
 300   template <class T>
 301   inline void do_oop_work(T* p)     { work<T, true, false, false>(p); }
 302 
 303 public:
 304   ShenandoahTraversalMetadataDedupClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
 305     ShenandoahTraversalSuperClosure(q, rp) {}
 306 
 307   virtual void do_oop(narrowOop* p) { do_oop_work(p); }
 308   virtual void do_oop(oop* p)       { do_oop_work(p); }
 309 
 310   virtual bool do_metadata()        { return true; }
 311 };
 312 
 313 class ShenandoahTraversalDegenClosure : public ShenandoahTraversalSuperClosure {
 314 private:
 315   template <class T>
 316   inline void do_oop_work(T* p)     { work<T, false, true, false>(p); }
 317 
 318 public:
 319   ShenandoahTraversalDegenClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
 320     ShenandoahTraversalSuperClosure(q, rp) {}
 321 
 322   virtual void do_oop(narrowOop* p) { do_oop_work(p); }
 323   virtual void do_oop(oop* p)       { do_oop_work(p); }
 324 
 325   virtual bool do_metadata()        { return false; }
 326 };
 327 
 328 class ShenandoahTraversalMetadataDegenClosure : public ShenandoahTraversalSuperClosure {
 329 private:
 330   template <class T>
 331   inline void do_oop_work(T* p)     { work<T, false, true, false>(p); }
 332 
 333 public:
 334   ShenandoahTraversalMetadataDegenClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
 335     ShenandoahTraversalSuperClosure(q, rp) {}
 336 
 337   virtual void do_oop(narrowOop* p) { do_oop_work(p); }
 338   virtual void do_oop(oop* p)       { do_oop_work(p); }
 339 
 340   virtual bool do_metadata()        { return true; }
 341 };
 342 
 343 class ShenandoahTraversalDedupDegenClosure : public ShenandoahTraversalSuperClosure {
 344 private:
 345   template <class T>
 346   inline void do_oop_work(T* p)     { work<T, true, true, false>(p); }
 347 
 348 public:
 349   ShenandoahTraversalDedupDegenClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
 350     ShenandoahTraversalSuperClosure(q, rp) {}
 351 
 352   virtual void do_oop(narrowOop* p) { do_oop_work(p); }
 353   virtual void do_oop(oop* p)       { do_oop_work(p); }
 354 
 355   virtual bool do_metadata()        { return false; }
 356 };
 357 
 358 class ShenandoahTraversalMetadataDedupDegenClosure : public ShenandoahTraversalSuperClosure {
 359 private:
 360   template <class T>
 361   inline void do_oop_work(T* p)     { work<T, true, true, false>(p); }
 362 
 363 public:
 364   ShenandoahTraversalMetadataDedupDegenClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
 365     ShenandoahTraversalSuperClosure(q, rp) {}
 366 
 367   virtual void do_oop(narrowOop* p) { do_oop_work(p); }
 368   virtual void do_oop(oop* p)       { do_oop_work(p); }
 369 
 370   virtual bool do_metadata()        { return true; }
 371 };
 372 
 373 class ShenandoahTraversalMatrixClosure : public ShenandoahTraversalSuperClosure {
 374 private:
 375   template <class T>
 376   inline void do_oop_work(T* p)     { work<T, false, false, true>(p); }
 377 
 378 public:
 379   ShenandoahTraversalMatrixClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
 380     ShenandoahTraversalSuperClosure(q, rp) {}
 381 
 382   virtual void do_oop(narrowOop* p) { do_oop_work(p); }
 383   virtual void do_oop(oop* p)       { do_oop_work(p); }
 384 
 385   virtual bool do_metadata()        { return false; }
 386 };
 387 
 388 class ShenandoahTraversalMetadataMatrixClosure : public ShenandoahTraversalSuperClosure {
 389 private:
 390   template <class T>
 391   inline void do_oop_work(T* p)     { work<T, false, false, true>(p); }
 392 
 393 public:
 394   ShenandoahTraversalMetadataMatrixClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
 395     ShenandoahTraversalSuperClosure(q, rp) {}
 396 
 397   virtual void do_oop(narrowOop* p) { do_oop_work(p); }
 398   virtual void do_oop(oop* p)       { do_oop_work(p); }
 399 
 400   virtual bool do_metadata()        { return true; }
 401 };
 402 
 403 class ShenandoahTraversalDedupMatrixClosure : public ShenandoahTraversalSuperClosure {
 404 private:
 405   template <class T>
 406   inline void do_oop_work(T* p)     { work<T, true, false, true>(p); }
 407 
 408 public:
 409   ShenandoahTraversalDedupMatrixClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
 410     ShenandoahTraversalSuperClosure(q, rp) {}
 411 
 412   virtual void do_oop(narrowOop* p) { do_oop_work(p); }
 413   virtual void do_oop(oop* p)       { do_oop_work(p); }
 414 
 415   virtual bool do_metadata()        { return false; }
 416 };
 417 
 418 class ShenandoahTraversalMetadataDedupMatrixClosure : public ShenandoahTraversalSuperClosure {
 419 private:
 420   template <class T>
 421   inline void do_oop_work(T* p)     { work<T, true, false, true>(p); }
 422 
 423 public:
 424   ShenandoahTraversalMetadataDedupMatrixClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
 425     ShenandoahTraversalSuperClosure(q, rp) {}
 426 
 427   virtual void do_oop(narrowOop* p) { do_oop_work(p); }
 428   virtual void do_oop(oop* p)       { do_oop_work(p); }
 429 
 430   virtual bool do_metadata()        { return true; }
 431 };
 432 
 433 class ShenandoahTraversalDegenMatrixClosure : public ShenandoahTraversalSuperClosure {
 434 private:
 435   template <class T>
 436   inline void do_oop_work(T* p)     { work<T, false, true, true>(p); }
 437 
 438 public:
 439   ShenandoahTraversalDegenMatrixClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
 440     ShenandoahTraversalSuperClosure(q, rp) {}
 441 
 442   virtual void do_oop(narrowOop* p) { do_oop_work(p); }
 443   virtual void do_oop(oop* p)       { do_oop_work(p); }
 444 
 445   virtual bool do_metadata()        { return false; }
 446 };
 447 
 448 class ShenandoahTraversalMetadataDegenMatrixClosure : public ShenandoahTraversalSuperClosure {
 449 private:
 450   template <class T>
 451   inline void do_oop_work(T* p)     { work<T, false, true, true>(p); }
 452 
 453 public:
 454   ShenandoahTraversalMetadataDegenMatrixClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
 455     ShenandoahTraversalSuperClosure(q, rp) {}
 456 
 457   virtual void do_oop(narrowOop* p) { do_oop_work(p); }
 458   virtual void do_oop(oop* p)       { do_oop_work(p); }
 459 
 460   virtual bool do_metadata()        { return true; }
 461 };
 462 
 463 class ShenandoahTraversalDedupDegenMatrixClosure : public ShenandoahTraversalSuperClosure {
 464 private:
 465   template <class T>
 466   inline void do_oop_work(T* p)     { work<T, true, true, true>(p); }
 467 
 468 public:
 469   ShenandoahTraversalDedupDegenMatrixClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
 470     ShenandoahTraversalSuperClosure(q, rp) {}
 471 
 472   virtual void do_oop(narrowOop* p) { do_oop_work(p); }
 473   virtual void do_oop(oop* p)       { do_oop_work(p); }
 474 
 475   virtual bool do_metadata()        { return false; }
 476 };
 477 
 478 class ShenandoahTraversalMetadataDedupDegenMatrixClosure : public ShenandoahTraversalSuperClosure {
 479 private:
 480   template <class T>
 481   inline void do_oop_work(T* p)     { work<T, true, true, true>(p); }
 482 
 483 public:
 484   ShenandoahTraversalMetadataDedupDegenMatrixClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
 485     ShenandoahTraversalSuperClosure(q, rp) {}
 486 
 487   virtual void do_oop(narrowOop* p) { do_oop_work(p); }
 488   virtual void do_oop(oop* p)       { do_oop_work(p); }
 489 
 490   virtual bool do_metadata()        { return true; }
 491 };
 492 
 493 #endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHOOPCLOSURES_HPP