1 /*
   2  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 #ifndef SHARE_VM_GC_IMPLEMENTATION_CONCURRENTMARKSWEEP_CMSOOPCLOSURES_HPP
  26 #define SHARE_VM_GC_IMPLEMENTATION_CONCURRENTMARKSWEEP_CMSOOPCLOSURES_HPP
  27 
  28 #include "memory/genOopClosures.hpp"
  29 
  30 /////////////////////////////////////////////////////////////////
  31 // Closures used by ConcurrentMarkSweepGeneration's collector
  32 /////////////////////////////////////////////////////////////////
  33 class ConcurrentMarkSweepGeneration;
  34 class CMSBitMap;
  35 class CMSMarkStack;
  36 class CMSCollector;
  37 class MarkFromRootsClosure;
  38 class Par_MarkFromRootsClosure;
  39 
  40 // Decode the oop and call do_oop on it.
  41 #define DO_OOP_WORK_DEFN \
  42   void do_oop(oop obj);                                   \
  43   template <class T> inline void do_oop_work(T* p) {      \
  44     T heap_oop = oopDesc::load_heap_oop(p);               \
  45     if (!oopDesc::is_null(heap_oop)) {                    \
  46       oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);       \
  47       do_oop(obj);                                        \
  48     }                                                     \
  49   }
  50 
  51 class MarkRefsIntoClosure: public OopsInGenClosure {
  52  private:
  53   const MemRegion _span;
  54   CMSBitMap*      _bitMap;
  55  protected:
  56   DO_OOP_WORK_DEFN
  57  public:
  58   MarkRefsIntoClosure(MemRegion span, CMSBitMap* bitMap);
  59   virtual void do_oop(oop* p);
  60   virtual void do_oop(narrowOop* p);
  61   inline void do_oop_nv(oop* p)       { MarkRefsIntoClosure::do_oop_work(p); }
  62   inline void do_oop_nv(narrowOop* p) { MarkRefsIntoClosure::do_oop_work(p); }
  63   bool do_header() { return true; }
  64   Prefetch::style prefetch_style() {
  65     return Prefetch::do_read;
  66   }
  67 };
  68 
  69 // A variant of the above used in certain kinds of CMS
  70 // marking verification.
  71 class MarkRefsIntoVerifyClosure: public OopsInGenClosure {
  72  private:
  73   const MemRegion _span;
  74   CMSBitMap*      _verification_bm;
  75   CMSBitMap*      _cms_bm;
  76  protected:
  77   DO_OOP_WORK_DEFN
  78  public:
  79   MarkRefsIntoVerifyClosure(MemRegion span, CMSBitMap* verification_bm,
  80                             CMSBitMap* cms_bm);
  81   virtual void do_oop(oop* p);
  82   virtual void do_oop(narrowOop* p);
  83   inline void do_oop_nv(oop* p)       { MarkRefsIntoVerifyClosure::do_oop_work(p); }
  84   inline void do_oop_nv(narrowOop* p) { MarkRefsIntoVerifyClosure::do_oop_work(p); }
  85   bool do_header() { return true; }
  86   Prefetch::style prefetch_style() {
  87     return Prefetch::do_read;
  88   }
  89 };
  90 
  91 // KlassRememberingOopClosure is used when marking of the permanent generation
  92 // is being done.  It adds fields to support revisiting of klasses
  93 // for class unloading.  _should_remember_klasses should be set to
  94 // indicate if klasses should be remembered.  Currently that is whenever
  95 // CMS class unloading is turned on.  The _revisit_stack is used
  96 // to save the klasses for later processing.
  97 class KlassRememberingOopClosure : public OopClosure {
  98  protected:
  99   CMSCollector* _collector;
 100   CMSMarkStack* _revisit_stack;
 101   bool const    _should_remember_klasses;
 102  public:
 103   void check_remember_klasses() const PRODUCT_RETURN;
 104   virtual const bool should_remember_klasses() const {
 105     check_remember_klasses();
 106     return _should_remember_klasses;
 107   }
 108   virtual void remember_klass(Klass* k);
 109 
 110   KlassRememberingOopClosure(CMSCollector* collector,
 111                              ReferenceProcessor* rp,
 112                              CMSMarkStack* revisit_stack);
 113 };
 114 
 115 // Similar to KlassRememberingOopClosure for use when multiple
 116 // GC threads will execute the closure.
 117 
 118 class Par_KlassRememberingOopClosure : public KlassRememberingOopClosure {
 119  public:
 120   Par_KlassRememberingOopClosure(CMSCollector* collector,
 121                                  ReferenceProcessor* rp,
 122                                  CMSMarkStack* revisit_stack):
 123     KlassRememberingOopClosure(collector, rp, revisit_stack) {}
 124   virtual void remember_klass(Klass* k);
 125 };
 126 
 127 // The non-parallel version (the parallel version appears further below).
 128 class PushAndMarkClosure: public KlassRememberingOopClosure {
 129  private:
 130   MemRegion     _span;
 131   CMSBitMap*    _bit_map;
 132   CMSBitMap*    _mod_union_table;
 133   CMSMarkStack* _mark_stack;
 134   bool          _concurrent_precleaning;
 135  protected:
 136   DO_OOP_WORK_DEFN
 137  public:
 138   PushAndMarkClosure(CMSCollector* collector,
 139                      MemRegion span,
 140                      ReferenceProcessor* rp,
 141                      CMSBitMap* bit_map,
 142                      CMSBitMap* mod_union_table,
 143                      CMSMarkStack* mark_stack,
 144                      CMSMarkStack* revisit_stack,
 145                      bool concurrent_precleaning);
 146   virtual void do_oop(oop* p);
 147   virtual void do_oop(narrowOop* p);
 148   inline void do_oop_nv(oop* p)       { PushAndMarkClosure::do_oop_work(p); }
 149   inline void do_oop_nv(narrowOop* p) { PushAndMarkClosure::do_oop_work(p); }
 150   bool do_header() { return true; }
 151   Prefetch::style prefetch_style() {
 152     return Prefetch::do_read;
 153   }
 154   // In support of class unloading
 155   virtual const bool should_remember_mdo() const {
 156     return false;
 157     // return _should_remember_klasses;
 158   }
 159   virtual void remember_mdo(DataLayout* v);
 160 };
 161 
 162 // In the parallel case, the revisit stack, the bit map and the
 163 // reference processor are currently all shared. Access to
 164 // these shared mutable structures must use appropriate
 165 // synchronization (for instance, via CAS). The marking stack
 166 // used in the non-parallel case above is here replaced with
 167 // an OopTaskQueue structure to allow efficient work stealing.
 168 class Par_PushAndMarkClosure: public Par_KlassRememberingOopClosure {
 169  private:
 170   MemRegion     _span;
 171   CMSBitMap*    _bit_map;
 172   OopTaskQueue* _work_queue;
 173  protected:
 174   DO_OOP_WORK_DEFN
 175  public:
 176   Par_PushAndMarkClosure(CMSCollector* collector,
 177                          MemRegion span,
 178                          ReferenceProcessor* rp,
 179                          CMSBitMap* bit_map,
 180                          OopTaskQueue* work_queue,
 181                          CMSMarkStack* revisit_stack);
 182   virtual void do_oop(oop* p);
 183   virtual void do_oop(narrowOop* p);
 184   inline void do_oop_nv(oop* p)       { Par_PushAndMarkClosure::do_oop_work(p); }
 185   inline void do_oop_nv(narrowOop* p) { Par_PushAndMarkClosure::do_oop_work(p); }
 186   bool do_header() { return true; }
 187   Prefetch::style prefetch_style() {
 188     return Prefetch::do_read;
 189   }
 190   // In support of class unloading
 191   virtual const bool should_remember_mdo() const {
 192     return false;
 193     // return _should_remember_klasses;
 194   }
 195   virtual void remember_mdo(DataLayout* v);
 196 };
 197 
 198 // The non-parallel version (the parallel version appears further below).
 199 class MarkRefsIntoAndScanClosure: public OopsInGenClosure {
 200  private:
 201   MemRegion          _span;
 202   CMSBitMap*         _bit_map;
 203   CMSMarkStack*      _mark_stack;
 204   PushAndMarkClosure _pushAndMarkClosure;
 205   CMSCollector*      _collector;
 206   Mutex*             _freelistLock;
 207   bool               _yield;
 208   // Whether closure is being used for concurrent precleaning
 209   bool               _concurrent_precleaning;
 210  protected:
 211   DO_OOP_WORK_DEFN
 212  public:
 213   MarkRefsIntoAndScanClosure(MemRegion span,
 214                              ReferenceProcessor* rp,
 215                              CMSBitMap* bit_map,
 216                              CMSBitMap* mod_union_table,
 217                              CMSMarkStack* mark_stack,
 218                              CMSMarkStack* revisit_stack,
 219                              CMSCollector* collector,
 220                              bool should_yield,
 221                              bool concurrent_precleaning);
 222   virtual void do_oop(oop* p);
 223   virtual void do_oop(narrowOop* p);
 224   inline void do_oop_nv(oop* p)       { MarkRefsIntoAndScanClosure::do_oop_work(p); }
 225   inline void do_oop_nv(narrowOop* p) { MarkRefsIntoAndScanClosure::do_oop_work(p); }
 226   bool do_header() { return true; }
 227   Prefetch::style prefetch_style() {
 228     return Prefetch::do_read;
 229   }
 230   void set_freelistLock(Mutex* m) {
 231     _freelistLock = m;
 232   }
 233   virtual const bool should_remember_klasses() const {
 234     return _pushAndMarkClosure.should_remember_klasses();
 235   }
 236   virtual void remember_klass(Klass* k) {
 237     _pushAndMarkClosure.remember_klass(k);
 238   }
 239 
 240  private:
 241   inline void do_yield_check();
 242   void do_yield_work();
 243   bool take_from_overflow_list();
 244 };
 245 
 246 // Tn this, the parallel avatar of MarkRefsIntoAndScanClosure, the revisit
 247 // stack and the bitMap are shared, so access needs to be suitably
 248 // sycnhronized. An OopTaskQueue structure, supporting efficient
 249 // workstealing, replaces a CMSMarkStack for storing grey objects.
 250 class Par_MarkRefsIntoAndScanClosure: public OopsInGenClosure {
 251  private:
 252   MemRegion              _span;
 253   CMSBitMap*             _bit_map;
 254   OopTaskQueue*          _work_queue;
 255   const uint             _low_water_mark;
 256   Par_PushAndMarkClosure _par_pushAndMarkClosure;
 257  protected:
 258   DO_OOP_WORK_DEFN
 259  public:
 260   Par_MarkRefsIntoAndScanClosure(CMSCollector* collector,
 261                                  MemRegion span,
 262                                  ReferenceProcessor* rp,
 263                                  CMSBitMap* bit_map,
 264                                  OopTaskQueue* work_queue,
 265                                  CMSMarkStack*  revisit_stack);
 266   virtual void do_oop(oop* p);
 267   virtual void do_oop(narrowOop* p);
 268   inline void do_oop_nv(oop* p)       { Par_MarkRefsIntoAndScanClosure::do_oop_work(p); }
 269   inline void do_oop_nv(narrowOop* p) { Par_MarkRefsIntoAndScanClosure::do_oop_work(p); }
 270   bool do_header() { return true; }
 271   // When ScanMarkedObjectsAgainClosure is used,
 272   // it passes [Par_]MarkRefsIntoAndScanClosure to oop_oop_iterate(),
 273   // and this delegation is used.
 274   virtual const bool should_remember_klasses() const {
 275     return _par_pushAndMarkClosure.should_remember_klasses();
 276   }
 277   // See comment on should_remember_klasses() above.
 278   virtual void remember_klass(Klass* k) {
 279     _par_pushAndMarkClosure.remember_klass(k);
 280   }
 281   Prefetch::style prefetch_style() {
 282     return Prefetch::do_read;
 283   }
 284   void trim_queue(uint size);
 285 };
 286 
 287 // This closure is used during the concurrent marking phase
 288 // following the first checkpoint. Its use is buried in
 289 // the closure MarkFromRootsClosure.
 290 class PushOrMarkClosure: public KlassRememberingOopClosure {
 291  private:
 292   MemRegion       _span;
 293   CMSBitMap*      _bitMap;
 294   CMSMarkStack*   _markStack;
 295   HeapWord* const _finger;
 296   MarkFromRootsClosure* const
 297                   _parent;
 298  protected:
 299   DO_OOP_WORK_DEFN
 300  public:
 301   PushOrMarkClosure(CMSCollector* cms_collector,
 302                     MemRegion span,
 303                     CMSBitMap* bitMap,
 304                     CMSMarkStack* markStack,
 305                     CMSMarkStack* revisitStack,
 306                     HeapWord* finger,
 307                     MarkFromRootsClosure* parent);
 308   virtual void do_oop(oop* p);
 309   virtual void do_oop(narrowOop* p);
 310   inline void do_oop_nv(oop* p)       { PushOrMarkClosure::do_oop_work(p); }
 311   inline void do_oop_nv(narrowOop* p) { PushOrMarkClosure::do_oop_work(p); }
 312   // In support of class unloading
 313   virtual const bool should_remember_mdo() const {
 314     return false;
 315     // return _should_remember_klasses;
 316   }
 317   virtual void remember_mdo(DataLayout* v);
 318 
 319   // Deal with a stack overflow condition
 320   void handle_stack_overflow(HeapWord* lost);
 321  private:
 322   inline void do_yield_check();
 323 };
 324 
 325 // A parallel (MT) version of the above.
 326 // This closure is used during the concurrent marking phase
 327 // following the first checkpoint. Its use is buried in
 328 // the closure Par_MarkFromRootsClosure.
 329 class Par_PushOrMarkClosure: public Par_KlassRememberingOopClosure {
 330  private:
 331   MemRegion        _whole_span;
 332   MemRegion        _span;        // local chunk
 333   CMSBitMap*       _bit_map;
 334   OopTaskQueue*    _work_queue;
 335   CMSMarkStack*    _overflow_stack;
 336   HeapWord*  const _finger;
 337   HeapWord** const _global_finger_addr;
 338   Par_MarkFromRootsClosure* const
 339                    _parent;
 340  protected:
 341   DO_OOP_WORK_DEFN
 342  public:
 343   Par_PushOrMarkClosure(CMSCollector* cms_collector,
 344                         MemRegion span,
 345                         CMSBitMap* bit_map,
 346                         OopTaskQueue* work_queue,
 347                         CMSMarkStack* mark_stack,
 348                         CMSMarkStack* revisit_stack,
 349                         HeapWord* finger,
 350                         HeapWord** global_finger_addr,
 351                         Par_MarkFromRootsClosure* parent);
 352   virtual void do_oop(oop* p);
 353   virtual void do_oop(narrowOop* p);
 354   inline void do_oop_nv(oop* p)       { Par_PushOrMarkClosure::do_oop_work(p); }
 355   inline void do_oop_nv(narrowOop* p) { Par_PushOrMarkClosure::do_oop_work(p); }
 356   // In support of class unloading
 357   virtual const bool should_remember_mdo() const {
 358     return false;
 359     // return _should_remember_klasses;
 360   }
 361   virtual void remember_mdo(DataLayout* v);
 362 
 363   // Deal with a stack overflow condition
 364   void handle_stack_overflow(HeapWord* lost);
 365  private:
 366   inline void do_yield_check();
 367 };
 368 
 369 // For objects in CMS generation, this closure marks
 370 // given objects (transitively) as being reachable/live.
 371 // This is currently used during the (weak) reference object
 372 // processing phase of the CMS final checkpoint step, as
 373 // well as during the concurrent precleaning of the discovered
 374 // reference lists.
 375 class CMSKeepAliveClosure: public KlassRememberingOopClosure {
 376  private:
 377   const MemRegion _span;
 378   CMSMarkStack* _mark_stack;
 379   CMSBitMap*    _bit_map;
 380   bool          _concurrent_precleaning;
 381  protected:
 382   DO_OOP_WORK_DEFN
 383  public:
 384   CMSKeepAliveClosure(CMSCollector* collector, MemRegion span,
 385                       CMSBitMap* bit_map, CMSMarkStack* mark_stack,
 386                       CMSMarkStack* revisit_stack, bool cpc);
 387   bool    concurrent_precleaning() const { return _concurrent_precleaning; }
 388   virtual void do_oop(oop* p);
 389   virtual void do_oop(narrowOop* p);
 390   inline void do_oop_nv(oop* p)       { CMSKeepAliveClosure::do_oop_work(p); }
 391   inline void do_oop_nv(narrowOop* p) { CMSKeepAliveClosure::do_oop_work(p); }
 392 };
 393 
 394 class CMSInnerParMarkAndPushClosure: public Par_KlassRememberingOopClosure {
 395  private:
 396   MemRegion     _span;
 397   OopTaskQueue* _work_queue;
 398   CMSBitMap*    _bit_map;
 399  protected:
 400   DO_OOP_WORK_DEFN
 401  public:
 402   CMSInnerParMarkAndPushClosure(CMSCollector* collector,
 403                                 MemRegion span, CMSBitMap* bit_map,
 404                                 CMSMarkStack* revisit_stack,
 405                                 OopTaskQueue* work_queue);
 406   virtual void do_oop(oop* p);
 407   virtual void do_oop(narrowOop* p);
 408   inline void do_oop_nv(oop* p)       { CMSInnerParMarkAndPushClosure::do_oop_work(p); }
 409   inline void do_oop_nv(narrowOop* p) { CMSInnerParMarkAndPushClosure::do_oop_work(p); }
 410 };
 411 
 412 // A parallel (MT) version of the above, used when
 413 // reference processing is parallel; the only difference
 414 // is in the do_oop method.
 415 class CMSParKeepAliveClosure: public Par_KlassRememberingOopClosure {
 416  private:
 417   MemRegion     _span;
 418   OopTaskQueue* _work_queue;
 419   CMSBitMap*    _bit_map;
 420   CMSInnerParMarkAndPushClosure
 421                 _mark_and_push;
 422   const uint    _low_water_mark;
 423   void trim_queue(uint max);
 424  protected:
 425   DO_OOP_WORK_DEFN
 426  public:
 427   CMSParKeepAliveClosure(CMSCollector* collector, MemRegion span,
 428                          CMSBitMap* bit_map, CMSMarkStack* revisit_stack,
 429                          OopTaskQueue* work_queue);
 430   virtual void do_oop(oop* p);
 431   virtual void do_oop(narrowOop* p);
 432   inline void do_oop_nv(oop* p)       { CMSParKeepAliveClosure::do_oop_work(p); }
 433   inline void do_oop_nv(narrowOop* p) { CMSParKeepAliveClosure::do_oop_work(p); }
 434 };
 435 
 436 #endif // SHARE_VM_GC_IMPLEMENTATION_CONCURRENTMARKSWEEP_CMSOOPCLOSURES_HPP