src/share/vm/gc_implementation/concurrentMarkSweep/cmsOopClosures.hpp

changeset 548
ba764ed4b6f2
parent 435
a61af66fc99e
child 578
b5489bb705c9
     1.1 --- a/src/share/vm/gc_implementation/concurrentMarkSweep/cmsOopClosures.hpp	Fri Apr 11 09:56:35 2008 -0400
     1.2 +++ b/src/share/vm/gc_implementation/concurrentMarkSweep/cmsOopClosures.hpp	Sun Apr 13 17:43:42 2008 -0400
     1.3 @@ -29,22 +29,34 @@
     1.4  class CMSBitMap;
     1.5  class CMSMarkStack;
     1.6  class CMSCollector;
     1.7 -template<class E> class GenericTaskQueue;
     1.8 -typedef GenericTaskQueue<oop> OopTaskQueue;
     1.9 -template<class E> class GenericTaskQueueSet;
    1.10 -typedef GenericTaskQueueSet<oop> OopTaskQueueSet;
    1.11  class MarkFromRootsClosure;
    1.12  class Par_MarkFromRootsClosure;
    1.13  
    1.14 +// Decode the oop and call do_oop on it.
    1.15 +#define DO_OOP_WORK_DEFN \
    1.16 +  void do_oop(oop obj);                                   \
    1.17 +  template <class T> inline void do_oop_work(T* p) {      \
    1.18 +    T heap_oop = oopDesc::load_heap_oop(p);               \
    1.19 +    if (!oopDesc::is_null(heap_oop)) {                    \
    1.20 +      oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);       \
    1.21 +      do_oop(obj);                                        \
    1.22 +    }                                                     \
    1.23 +  }
    1.24 +
    1.25  class MarkRefsIntoClosure: public OopsInGenClosure {
    1.26 -  const MemRegion    _span;
    1.27 -  CMSBitMap*         _bitMap;
    1.28 -  const bool         _should_do_nmethods;
    1.29 + private:
    1.30 +  const MemRegion _span;
    1.31 +  CMSBitMap*      _bitMap;
    1.32 +  const bool      _should_do_nmethods;
    1.33 + protected:
    1.34 +  DO_OOP_WORK_DEFN
    1.35   public:
    1.36    MarkRefsIntoClosure(MemRegion span, CMSBitMap* bitMap,
    1.37                        bool should_do_nmethods);
    1.38 -  void do_oop(oop* p);
    1.39 -  void do_oop_nv(oop* p) { MarkRefsIntoClosure::do_oop(p); }
    1.40 +  virtual void do_oop(oop* p);
    1.41 +  virtual void do_oop(narrowOop* p);
    1.42 +  inline void do_oop_nv(oop* p)       { MarkRefsIntoClosure::do_oop_work(p); }
    1.43 +  inline void do_oop_nv(narrowOop* p) { MarkRefsIntoClosure::do_oop_work(p); }
    1.44    bool do_header() { return true; }
    1.45    virtual const bool do_nmethods() const {
    1.46      return _should_do_nmethods;
    1.47 @@ -57,15 +69,20 @@
    1.48  // A variant of the above used in certain kinds of CMS
    1.49  // marking verification.
    1.50  class MarkRefsIntoVerifyClosure: public OopsInGenClosure {
    1.51 -  const MemRegion    _span;
    1.52 -  CMSBitMap*         _verification_bm;
    1.53 -  CMSBitMap*         _cms_bm;
    1.54 -  const bool         _should_do_nmethods;
    1.55 + private:
    1.56 +  const MemRegion _span;
    1.57 +  CMSBitMap*      _verification_bm;
    1.58 +  CMSBitMap*      _cms_bm;
    1.59 +  const bool      _should_do_nmethods;
    1.60 + protected:
    1.61 +  DO_OOP_WORK_DEFN
    1.62   public:
    1.63    MarkRefsIntoVerifyClosure(MemRegion span, CMSBitMap* verification_bm,
    1.64                              CMSBitMap* cms_bm, bool should_do_nmethods);
    1.65 -  void do_oop(oop* p);
    1.66 -  void do_oop_nv(oop* p) { MarkRefsIntoVerifyClosure::do_oop(p); }
    1.67 +  virtual void do_oop(oop* p);
    1.68 +  virtual void do_oop(narrowOop* p);
    1.69 +  inline void do_oop_nv(oop* p)       { MarkRefsIntoVerifyClosure::do_oop_work(p); }
    1.70 +  inline void do_oop_nv(narrowOop* p) { MarkRefsIntoVerifyClosure::do_oop_work(p); }
    1.71    bool do_header() { return true; }
    1.72    virtual const bool do_nmethods() const {
    1.73      return _should_do_nmethods;
    1.74 @@ -75,37 +92,40 @@
    1.75    }
    1.76  };
    1.77  
    1.78 -
    1.79  // The non-parallel version (the parallel version appears further below).
    1.80  class PushAndMarkClosure: public OopClosure {
    1.81 -  CMSCollector*    _collector;
    1.82 -  MemRegion        _span;
    1.83 -  CMSBitMap*       _bit_map;
    1.84 -  CMSBitMap*       _mod_union_table;
    1.85 -  CMSMarkStack*    _mark_stack;
    1.86 -  CMSMarkStack*    _revisit_stack;
    1.87 -  bool             _concurrent_precleaning;
    1.88 -  bool     const   _should_remember_klasses;
    1.89 + private:
    1.90 +  CMSCollector* _collector;
    1.91 +  MemRegion     _span;
    1.92 +  CMSBitMap*    _bit_map;
    1.93 +  CMSBitMap*    _mod_union_table;
    1.94 +  CMSMarkStack* _mark_stack;
    1.95 +  CMSMarkStack* _revisit_stack;
    1.96 +  bool          _concurrent_precleaning;
    1.97 +  bool const    _should_remember_klasses;
    1.98 + protected:
    1.99 +  DO_OOP_WORK_DEFN
   1.100   public:
   1.101    PushAndMarkClosure(CMSCollector* collector,
   1.102                       MemRegion span,
   1.103                       ReferenceProcessor* rp,
   1.104                       CMSBitMap* bit_map,
   1.105                       CMSBitMap* mod_union_table,
   1.106 -                     CMSMarkStack*  mark_stack,
   1.107 -                     CMSMarkStack*  revisit_stack,
   1.108 -                     bool           concurrent_precleaning);
   1.109 -
   1.110 -  void do_oop(oop* p);
   1.111 -  void do_oop_nv(oop* p)  { PushAndMarkClosure::do_oop(p); }
   1.112 +                     CMSMarkStack* mark_stack,
   1.113 +                     CMSMarkStack* revisit_stack,
   1.114 +                     bool concurrent_precleaning);
   1.115 +  virtual void do_oop(oop* p);
   1.116 +  virtual void do_oop(narrowOop* p);
   1.117 +  inline void do_oop_nv(oop* p)       { PushAndMarkClosure::do_oop_work(p); }
   1.118 +  inline void do_oop_nv(narrowOop* p) { PushAndMarkClosure::do_oop_work(p); }
   1.119    bool do_header() { return true; }
   1.120    Prefetch::style prefetch_style() {
   1.121      return Prefetch::do_read;
   1.122    }
   1.123 -  const bool should_remember_klasses() const {
   1.124 +  virtual const bool should_remember_klasses() const {
   1.125      return _should_remember_klasses;
   1.126    }
   1.127 -  void remember_klass(Klass* k);
   1.128 +  virtual void remember_klass(Klass* k);
   1.129  };
   1.130  
   1.131  // In the parallel case, the revisit stack, the bit map and the
   1.132 @@ -115,12 +135,15 @@
   1.133  // used in the non-parallel case above is here replaced with
   1.134  // an OopTaskQueue structure to allow efficient work stealing.
   1.135  class Par_PushAndMarkClosure: public OopClosure {
   1.136 -  CMSCollector*    _collector;
   1.137 -  MemRegion        _span;
   1.138 -  CMSBitMap*       _bit_map;
   1.139 -  OopTaskQueue*    _work_queue;
   1.140 -  CMSMarkStack*    _revisit_stack;
   1.141 -  bool     const   _should_remember_klasses;
   1.142 + private:
   1.143 +  CMSCollector* _collector;
   1.144 +  MemRegion     _span;
   1.145 +  CMSBitMap*    _bit_map;
   1.146 +  OopTaskQueue* _work_queue;
   1.147 +  CMSMarkStack* _revisit_stack;
   1.148 +  bool const    _should_remember_klasses;
   1.149 + protected:
   1.150 +  DO_OOP_WORK_DEFN
   1.151   public:
   1.152    Par_PushAndMarkClosure(CMSCollector* collector,
   1.153                           MemRegion span,
   1.154 @@ -128,43 +151,48 @@
   1.155                           CMSBitMap* bit_map,
   1.156                           OopTaskQueue* work_queue,
   1.157                           CMSMarkStack* revisit_stack);
   1.158 -
   1.159 -  void do_oop(oop* p);
   1.160 -  void do_oop_nv(oop* p)  { Par_PushAndMarkClosure::do_oop(p); }
   1.161 +  virtual void do_oop(oop* p);
   1.162 +  virtual void do_oop(narrowOop* p);
   1.163 +  inline void do_oop_nv(oop* p)       { Par_PushAndMarkClosure::do_oop_work(p); }
   1.164 +  inline void do_oop_nv(narrowOop* p) { Par_PushAndMarkClosure::do_oop_work(p); }
   1.165    bool do_header() { return true; }
   1.166    Prefetch::style prefetch_style() {
   1.167      return Prefetch::do_read;
   1.168    }
   1.169 -  const bool should_remember_klasses() const {
   1.170 +  virtual const bool should_remember_klasses() const {
   1.171      return _should_remember_klasses;
   1.172    }
   1.173 -  void remember_klass(Klass* k);
   1.174 +  virtual void remember_klass(Klass* k);
   1.175  };
   1.176  
   1.177 -
   1.178  // The non-parallel version (the parallel version appears further below).
   1.179  class MarkRefsIntoAndScanClosure: public OopsInGenClosure {
   1.180 -  MemRegion                  _span;
   1.181 -  CMSBitMap*                 _bit_map;
   1.182 -  CMSMarkStack*              _mark_stack;
   1.183 -  PushAndMarkClosure         _pushAndMarkClosure;
   1.184 -  CMSCollector*              _collector;
   1.185 -  bool                       _yield;
   1.186 + private:
   1.187 +  MemRegion          _span;
   1.188 +  CMSBitMap*         _bit_map;
   1.189 +  CMSMarkStack*      _mark_stack;
   1.190 +  PushAndMarkClosure _pushAndMarkClosure;
   1.191 +  CMSCollector*      _collector;
   1.192 +  Mutex*             _freelistLock;
   1.193 +  bool               _yield;
   1.194    // Whether closure is being used for concurrent precleaning
   1.195 -  bool                       _concurrent_precleaning;
   1.196 -  Mutex*                     _freelistLock;
   1.197 +  bool               _concurrent_precleaning;
   1.198 + protected:
   1.199 +  DO_OOP_WORK_DEFN
   1.200   public:
   1.201    MarkRefsIntoAndScanClosure(MemRegion span,
   1.202                               ReferenceProcessor* rp,
   1.203                               CMSBitMap* bit_map,
   1.204                               CMSBitMap* mod_union_table,
   1.205 -                             CMSMarkStack*  mark_stack,
   1.206 -                             CMSMarkStack*  revisit_stack,
   1.207 +                             CMSMarkStack* mark_stack,
   1.208 +                             CMSMarkStack* revisit_stack,
   1.209                               CMSCollector* collector,
   1.210                               bool should_yield,
   1.211                               bool concurrent_precleaning);
   1.212 -  void do_oop(oop* p);
   1.213 -  void do_oop_nv(oop* p) { MarkRefsIntoAndScanClosure::do_oop(p); }
   1.214 +  virtual void do_oop(oop* p);
   1.215 +  virtual void do_oop(narrowOop* p);
   1.216 +  inline void do_oop_nv(oop* p)       { MarkRefsIntoAndScanClosure::do_oop_work(p); }
   1.217 +  inline void do_oop_nv(narrowOop* p) { MarkRefsIntoAndScanClosure::do_oop_work(p); }
   1.218    bool do_header() { return true; }
   1.219    virtual const bool do_nmethods() const { return true; }
   1.220    Prefetch::style prefetch_style() {
   1.221 @@ -185,11 +213,14 @@
   1.222  // sycnhronized. An OopTaskQueue structure, supporting efficient
   1.223  // workstealing, replaces a CMSMarkStack for storing grey objects.
   1.224  class Par_MarkRefsIntoAndScanClosure: public OopsInGenClosure {
   1.225 -  MemRegion                      _span;
   1.226 -  CMSBitMap*                     _bit_map;
   1.227 -  OopTaskQueue*                  _work_queue;
   1.228 -  const uint                     _low_water_mark;
   1.229 -  Par_PushAndMarkClosure         _par_pushAndMarkClosure;
   1.230 + private:
   1.231 +  MemRegion              _span;
   1.232 +  CMSBitMap*             _bit_map;
   1.233 +  OopTaskQueue*          _work_queue;
   1.234 +  const uint             _low_water_mark;
   1.235 +  Par_PushAndMarkClosure _par_pushAndMarkClosure;
   1.236 + protected:
   1.237 +  DO_OOP_WORK_DEFN
   1.238   public:
   1.239    Par_MarkRefsIntoAndScanClosure(CMSCollector* collector,
   1.240                                   MemRegion span,
   1.241 @@ -197,8 +228,10 @@
   1.242                                   CMSBitMap* bit_map,
   1.243                                   OopTaskQueue* work_queue,
   1.244                                   CMSMarkStack*  revisit_stack);
   1.245 -  void do_oop(oop* p);
   1.246 -  void do_oop_nv(oop* p) { Par_MarkRefsIntoAndScanClosure::do_oop(p); }
   1.247 +  virtual void do_oop(oop* p);
   1.248 +  virtual void do_oop(narrowOop* p);
   1.249 +  inline void do_oop_nv(oop* p)       { Par_MarkRefsIntoAndScanClosure::do_oop_work(p); }
   1.250 +  inline void do_oop_nv(narrowOop* p) { Par_MarkRefsIntoAndScanClosure::do_oop_work(p); }
   1.251    bool do_header() { return true; }
   1.252    virtual const bool do_nmethods() const { return true; }
   1.253    Prefetch::style prefetch_style() {
   1.254 @@ -211,28 +244,34 @@
   1.255  // following the first checkpoint. Its use is buried in
   1.256  // the closure MarkFromRootsClosure.
   1.257  class PushOrMarkClosure: public OopClosure {
   1.258 -  CMSCollector*    _collector;
   1.259 -  MemRegion        _span;
   1.260 -  CMSBitMap*       _bitMap;
   1.261 -  CMSMarkStack*    _markStack;
   1.262 -  CMSMarkStack*    _revisitStack;
   1.263 -  HeapWord* const  _finger;
   1.264 -  MarkFromRootsClosure* const _parent;
   1.265 -  bool                  const _should_remember_klasses;
   1.266 + private:
   1.267 +  CMSCollector*   _collector;
   1.268 +  MemRegion       _span;
   1.269 +  CMSBitMap*      _bitMap;
   1.270 +  CMSMarkStack*   _markStack;
   1.271 +  CMSMarkStack*   _revisitStack;
   1.272 +  HeapWord* const _finger;
   1.273 +  MarkFromRootsClosure* const
   1.274 +                  _parent;
   1.275 +  bool const      _should_remember_klasses;
   1.276 + protected:
   1.277 +  DO_OOP_WORK_DEFN
   1.278   public:
   1.279    PushOrMarkClosure(CMSCollector* cms_collector,
   1.280                      MemRegion span,
   1.281                      CMSBitMap* bitMap,
   1.282 -                    CMSMarkStack*  markStack,
   1.283 -                    CMSMarkStack*  revisitStack,
   1.284 -                    HeapWord*      finger,
   1.285 +                    CMSMarkStack* markStack,
   1.286 +                    CMSMarkStack* revisitStack,
   1.287 +                    HeapWord* finger,
   1.288                      MarkFromRootsClosure* parent);
   1.289 -  void do_oop(oop* p);
   1.290 -  void do_oop_nv(oop* p)  { PushOrMarkClosure::do_oop(p); }
   1.291 -  const bool should_remember_klasses() const {
   1.292 +  virtual void do_oop(oop* p);
   1.293 +  virtual void do_oop(narrowOop* p);
   1.294 +  inline void do_oop_nv(oop* p)       { PushOrMarkClosure::do_oop_work(p); }
   1.295 +  inline void do_oop_nv(narrowOop* p) { PushOrMarkClosure::do_oop_work(p); }
   1.296 +  virtual const bool should_remember_klasses() const {
   1.297      return _should_remember_klasses;
   1.298    }
   1.299 -  void remember_klass(Klass* k);
   1.300 +  virtual void remember_klass(Klass* k);
   1.301    // Deal with a stack overflow condition
   1.302    void handle_stack_overflow(HeapWord* lost);
   1.303   private:
   1.304 @@ -244,6 +283,7 @@
   1.305  // following the first checkpoint. Its use is buried in
   1.306  // the closure Par_MarkFromRootsClosure.
   1.307  class Par_PushOrMarkClosure: public OopClosure {
   1.308 + private:
   1.309    CMSCollector*    _collector;
   1.310    MemRegion        _whole_span;
   1.311    MemRegion        _span;        // local chunk
   1.312 @@ -253,24 +293,29 @@
   1.313    CMSMarkStack*    _revisit_stack;
   1.314    HeapWord*  const _finger;
   1.315    HeapWord** const _global_finger_addr;
   1.316 -  Par_MarkFromRootsClosure* const _parent;
   1.317 -  bool       const _should_remember_klasses;
   1.318 +  Par_MarkFromRootsClosure* const
   1.319 +                   _parent;
   1.320 +  bool const       _should_remember_klasses;
   1.321 + protected:
   1.322 +  DO_OOP_WORK_DEFN
   1.323   public:
   1.324    Par_PushOrMarkClosure(CMSCollector* cms_collector,
   1.325 -                    MemRegion span,
   1.326 -                    CMSBitMap* bit_map,
   1.327 -                    OopTaskQueue* work_queue,
   1.328 -                    CMSMarkStack*  mark_stack,
   1.329 -                    CMSMarkStack*  revisit_stack,
   1.330 -                    HeapWord*      finger,
   1.331 -                    HeapWord**     global_finger_addr,
   1.332 -                    Par_MarkFromRootsClosure* parent);
   1.333 -  void do_oop(oop* p);
   1.334 -  void do_oop_nv(oop* p)  { Par_PushOrMarkClosure::do_oop(p); }
   1.335 -  const bool should_remember_klasses() const {
   1.336 +                        MemRegion span,
   1.337 +                        CMSBitMap* bit_map,
   1.338 +                        OopTaskQueue* work_queue,
   1.339 +                        CMSMarkStack* mark_stack,
   1.340 +                        CMSMarkStack* revisit_stack,
   1.341 +                        HeapWord* finger,
   1.342 +                        HeapWord** global_finger_addr,
   1.343 +                        Par_MarkFromRootsClosure* parent);
   1.344 +  virtual void do_oop(oop* p);
   1.345 +  virtual void do_oop(narrowOop* p);
   1.346 +  inline void do_oop_nv(oop* p)       { Par_PushOrMarkClosure::do_oop_work(p); }
   1.347 +  inline void do_oop_nv(narrowOop* p) { Par_PushOrMarkClosure::do_oop_work(p); }
   1.348 +  virtual const bool should_remember_klasses() const {
   1.349      return _should_remember_klasses;
   1.350    }
   1.351 -  void remember_klass(Klass* k);
   1.352 +  virtual void remember_klass(Klass* k);
   1.353    // Deal with a stack overflow condition
   1.354    void handle_stack_overflow(HeapWord* lost);
   1.355   private:
   1.356 @@ -282,10 +327,13 @@
   1.357  // This is currently used during the (weak) reference object
   1.358  // processing phase of the CMS final checkpoint step.
   1.359  class CMSKeepAliveClosure: public OopClosure {
   1.360 + private:
   1.361    CMSCollector* _collector;
   1.362    MemRegion     _span;
   1.363    CMSMarkStack* _mark_stack;
   1.364    CMSBitMap*    _bit_map;
   1.365 + protected:
   1.366 +  DO_OOP_WORK_DEFN
   1.367   public:
   1.368    CMSKeepAliveClosure(CMSCollector* collector, MemRegion span,
   1.369                        CMSBitMap* bit_map, CMSMarkStack* mark_stack):
   1.370 @@ -293,16 +341,20 @@
   1.371      _span(span),
   1.372      _bit_map(bit_map),
   1.373      _mark_stack(mark_stack) { }
   1.374 -
   1.375 -  void do_oop(oop* p);
   1.376 -  void do_oop_nv(oop* p) { CMSKeepAliveClosure::do_oop(p); }
   1.377 +  virtual void do_oop(oop* p);
   1.378 +  virtual void do_oop(narrowOop* p);
   1.379 +  inline void do_oop_nv(oop* p)       { CMSKeepAliveClosure::do_oop_work(p); }
   1.380 +  inline void do_oop_nv(narrowOop* p) { CMSKeepAliveClosure::do_oop_work(p); }
   1.381  };
   1.382  
   1.383  class CMSInnerParMarkAndPushClosure: public OopClosure {
   1.384 + private:
   1.385    CMSCollector* _collector;
   1.386    MemRegion     _span;
   1.387    OopTaskQueue* _work_queue;
   1.388    CMSBitMap*    _bit_map;
   1.389 + protected:
   1.390 +  DO_OOP_WORK_DEFN
   1.391   public:
   1.392    CMSInnerParMarkAndPushClosure(CMSCollector* collector,
   1.393                                  MemRegion span, CMSBitMap* bit_map,
   1.394 @@ -311,24 +363,32 @@
   1.395      _span(span),
   1.396      _bit_map(bit_map),
   1.397      _work_queue(work_queue) { }
   1.398 -  void do_oop(oop* p);
   1.399 -  void do_oop_nv(oop* p) { CMSInnerParMarkAndPushClosure::do_oop(p); }
   1.400 +  virtual void do_oop(oop* p);
   1.401 +  virtual void do_oop(narrowOop* p);
   1.402 +  inline void do_oop_nv(oop* p)       { CMSInnerParMarkAndPushClosure::do_oop_work(p); }
   1.403 +  inline void do_oop_nv(narrowOop* p) { CMSInnerParMarkAndPushClosure::do_oop_work(p); }
   1.404  };
   1.405  
   1.406  // A parallel (MT) version of the above, used when
   1.407  // reference processing is parallel; the only difference
   1.408  // is in the do_oop method.
   1.409  class CMSParKeepAliveClosure: public OopClosure {
   1.410 + private:
   1.411    CMSCollector* _collector;
   1.412    MemRegion     _span;
   1.413    OopTaskQueue* _work_queue;
   1.414    CMSBitMap*    _bit_map;
   1.415 -  CMSInnerParMarkAndPushClosure _mark_and_push;
   1.416 +  CMSInnerParMarkAndPushClosure
   1.417 +                _mark_and_push;
   1.418    const uint    _low_water_mark;
   1.419    void trim_queue(uint max);
   1.420 + protected:
   1.421 +  DO_OOP_WORK_DEFN
   1.422   public:
   1.423    CMSParKeepAliveClosure(CMSCollector* collector, MemRegion span,
   1.424                           CMSBitMap* bit_map, OopTaskQueue* work_queue);
   1.425 -  void do_oop(oop* p);
   1.426 -  void do_oop_nv(oop* p) { CMSParKeepAliveClosure::do_oop(p); }
   1.427 +  virtual void do_oop(oop* p);
   1.428 +  virtual void do_oop(narrowOop* p);
   1.429 +  inline void do_oop_nv(oop* p)       { CMSParKeepAliveClosure::do_oop_work(p); }
   1.430 +  inline void do_oop_nv(narrowOop* p) { CMSParKeepAliveClosure::do_oop_work(p); }
   1.431  };

mercurial