hotspot/src/share/vm/memory/iterator.hpp
changeset 25356 4a4a482298a6
parent 23539 6382fd0ea303
child 25490 59f226da8d81
equal deleted inserted replaced
25355:29c97629997e 25356:4a4a482298a6
   113  public:
   113  public:
   114   virtual void do_cld(ClassLoaderData* cld) = 0;
   114   virtual void do_cld(ClassLoaderData* cld) = 0;
   115 };
   115 };
   116 
   116 
   117 class KlassToOopClosure : public KlassClosure {
   117 class KlassToOopClosure : public KlassClosure {
       
   118   friend class MetadataAwareOopClosure;
       
   119   friend class MetadataAwareOopsInGenClosure;
       
   120 
   118   OopClosure* _oop_closure;
   121   OopClosure* _oop_closure;
   119  public:
   122 
   120   KlassToOopClosure(OopClosure* oop_closure) : _oop_closure(oop_closure) {}
   123   // Used when _oop_closure couldn't be set in an initialization list.
       
   124   void initialize(OopClosure* oop_closure) {
       
   125     assert(_oop_closure == NULL, "Should only be called once");
       
   126     _oop_closure = oop_closure;
       
   127   }
       
   128 
       
   129 public:
       
   130   KlassToOopClosure(OopClosure* oop_closure = NULL) : _oop_closure(oop_closure) {}
   121   virtual void do_klass(Klass* k);
   131   virtual void do_klass(Klass* k);
   122 };
   132 };
   123 
   133 
   124 class CLDToOopClosure : public CLDClosure {
   134 class CLDToOopClosure : public CLDClosure {
   125   OopClosure* _oop_closure;
   135   OopClosure* _oop_closure;
   131       _oop_closure(oop_closure),
   141       _oop_closure(oop_closure),
   132       _klass_closure(oop_closure),
   142       _klass_closure(oop_closure),
   133       _must_claim_cld(must_claim_cld) {}
   143       _must_claim_cld(must_claim_cld) {}
   134 
   144 
   135   void do_cld(ClassLoaderData* cld);
   145   void do_cld(ClassLoaderData* cld);
       
   146 };
       
   147 
       
   148 // The base class for all concurrent marking closures,
       
   149 // that participates in class unloading.
       
   150 // It's used to proxy through the metadata to the oops defined in them.
       
   151 class MetadataAwareOopClosure: public ExtendedOopClosure {
       
   152   KlassToOopClosure _klass_closure;
       
   153 
       
   154  public:
       
   155   MetadataAwareOopClosure() : ExtendedOopClosure() {
       
   156     _klass_closure.initialize(this);
       
   157   }
       
   158   MetadataAwareOopClosure(ReferenceProcessor* rp) : ExtendedOopClosure(rp) {
       
   159     _klass_closure.initialize(this);
       
   160   }
       
   161 
       
   162   virtual bool do_metadata()    { return do_metadata_nv(); }
       
   163   inline  bool do_metadata_nv() { return true; }
       
   164 
       
   165   virtual void do_klass(Klass* k);
       
   166   void do_klass_nv(Klass* k);
       
   167 
       
   168   virtual void do_class_loader_data(ClassLoaderData* cld);
   136 };
   169 };
   137 
   170 
   138 // ObjectClosure is used for iterating through an object space
   171 // ObjectClosure is used for iterating through an object space
   139 
   172 
   140 class ObjectClosure : public Closure {
   173 class ObjectClosure : public Closure {
   316   static void store_symbol(Symbol** p, Symbol* sym) {
   349   static void store_symbol(Symbol** p, Symbol* sym) {
   317     *p = (Symbol*)(intptr_t(sym) | (intptr_t(*p) & 1));
   350     *p = (Symbol*)(intptr_t(sym) | (intptr_t(*p) & 1));
   318   }
   351   }
   319 };
   352 };
   320 
   353 
       
   354 
       
   355 // Helper defines for ExtendOopClosure
       
   356 
       
   357 #define if_do_metadata_checked(closure, nv_suffix)       \
       
   358   /* Make sure the non-virtual and the virtual versions match. */     \
       
   359   assert(closure->do_metadata##nv_suffix() == closure->do_metadata(), \
       
   360       "Inconsistency in do_metadata");                                \
       
   361   if (closure->do_metadata##nv_suffix())
       
   362 
       
   363 #define assert_should_ignore_metadata(closure, nv_suffix)                                  \
       
   364   assert(!closure->do_metadata##nv_suffix(), "Code to handle metadata is not implemented")
       
   365 
   321 #endif // SHARE_VM_MEMORY_ITERATOR_HPP
   366 #endif // SHARE_VM_MEMORY_ITERATOR_HPP