src/hotspot/share/memory/iterator.hpp
changeset 47580 96392e113a0a
parent 47216 71c04702a3d5
child 47676 b1c020fc35a3
equal deleted inserted replaced
47563:bbd116ac5ef3 47580:96392e113a0a
   136 class CLDClosure : public Closure {
   136 class CLDClosure : public Closure {
   137  public:
   137  public:
   138   virtual void do_cld(ClassLoaderData* cld) = 0;
   138   virtual void do_cld(ClassLoaderData* cld) = 0;
   139 };
   139 };
   140 
   140 
   141 class KlassToOopClosure : public KlassClosure {
       
   142   friend class MetadataAwareOopClosure;
       
   143   friend class MetadataAwareOopsInGenClosure;
       
   144 
       
   145   OopClosure* _oop_closure;
       
   146 
       
   147   // Used when _oop_closure couldn't be set in an initialization list.
       
   148   void initialize(OopClosure* oop_closure) {
       
   149     assert(_oop_closure == NULL, "Should only be called once");
       
   150     _oop_closure = oop_closure;
       
   151   }
       
   152 
       
   153  public:
       
   154   KlassToOopClosure(OopClosure* oop_closure = NULL) : _oop_closure(oop_closure) {}
       
   155 
       
   156   virtual void do_klass(Klass* k);
       
   157 };
       
   158 
   141 
   159 class CLDToOopClosure : public CLDClosure {
   142 class CLDToOopClosure : public CLDClosure {
   160   OopClosure*       _oop_closure;
   143   OopClosure*       _oop_closure;
   161   KlassToOopClosure _klass_closure;
       
   162   bool              _must_claim_cld;
   144   bool              _must_claim_cld;
   163 
   145 
   164  public:
   146  public:
   165   CLDToOopClosure(OopClosure* oop_closure, bool must_claim_cld = true) :
   147   CLDToOopClosure(OopClosure* oop_closure, bool must_claim_cld = true) :
   166       _oop_closure(oop_closure),
   148       _oop_closure(oop_closure),
   167       _klass_closure(oop_closure),
       
   168       _must_claim_cld(must_claim_cld) {}
   149       _must_claim_cld(must_claim_cld) {}
   169 
   150 
   170   void do_cld(ClassLoaderData* cld);
       
   171 };
       
   172 
       
   173 class CLDToKlassAndOopClosure : public CLDClosure {
       
   174   friend class G1CollectedHeap;
       
   175  protected:
       
   176   OopClosure*   _oop_closure;
       
   177   KlassClosure* _klass_closure;
       
   178   bool          _must_claim_cld;
       
   179  public:
       
   180   CLDToKlassAndOopClosure(KlassClosure* klass_closure,
       
   181                           OopClosure* oop_closure,
       
   182                           bool must_claim_cld) :
       
   183                               _oop_closure(oop_closure),
       
   184                               _klass_closure(klass_closure),
       
   185                               _must_claim_cld(must_claim_cld) {}
       
   186   void do_cld(ClassLoaderData* cld);
   151   void do_cld(ClassLoaderData* cld);
   187 };
   152 };
   188 
   153 
   189 // The base class for all concurrent marking closures,
   154 // The base class for all concurrent marking closures,
   190 // that participates in class unloading.
   155 // that participates in class unloading.
   191 // It's used to proxy through the metadata to the oops defined in them.
   156 // It's used to proxy through the metadata to the oops defined in them.
   192 class MetadataAwareOopClosure: public ExtendedOopClosure {
   157 class MetadataAwareOopClosure: public ExtendedOopClosure {
   193   KlassToOopClosure _klass_closure;
   158 
   194 
   159  public:
   195  public:
   160   MetadataAwareOopClosure() : ExtendedOopClosure() { }
   196   MetadataAwareOopClosure() : ExtendedOopClosure() {
   161   MetadataAwareOopClosure(ReferenceProcessor* rp) : ExtendedOopClosure(rp) { }
   197     _klass_closure.initialize(this);
       
   198   }
       
   199   MetadataAwareOopClosure(ReferenceProcessor* rp) : ExtendedOopClosure(rp) {
       
   200     _klass_closure.initialize(this);
       
   201   }
       
   202 
   162 
   203   bool do_metadata_nv()      { return true; }
   163   bool do_metadata_nv()      { return true; }
   204   virtual bool do_metadata() { return do_metadata_nv(); }
   164   virtual bool do_metadata() { return do_metadata_nv(); }
   205 
   165 
   206   void do_klass_nv(Klass* k);
   166   void do_klass_nv(Klass* k);