src/share/vm/classfile/classLoaderData.hpp

Print this page
rev 4524 : 8013136: NPG: Parallel class loading tests fail after fix for JDK-8011802
Summary: Move initialization of dependencies to before allocation of CLD
Reviewed-by:


  83 
  84 #ifndef PRODUCT
  85   // expensive test for pointer in metaspace for debugging
  86   static bool contains(address x);
  87   static bool contains_loader_data(ClassLoaderData* loader_data);
  88 #endif
  89 };
  90 
  91 // ClassLoaderData class
  92 
  93 class ClassLoaderData : public CHeapObj<mtClass> {
  94   friend class VMStructs;
  95  private:
  96   class Dependencies VALUE_OBJ_CLASS_SPEC {
  97     objArrayOop _list_head;
  98     void locked_add(objArrayHandle last,
  99                     objArrayHandle new_dependency,
 100                     Thread* THREAD);
 101    public:
 102     Dependencies() : _list_head(NULL) {}



 103     void add(Handle dependency, TRAPS);
 104     void init(TRAPS);
 105     void oops_do(OopClosure* f);
 106   };
 107 
 108   friend class ClassLoaderDataGraph;
 109   friend class ClassLoaderDataGraphMetaspaceIterator;
 110   friend class MetaDataFactory;
 111   friend class Method;
 112 
 113   static ClassLoaderData * _the_null_class_loader_data;
 114 
 115   oop _class_loader;          // oop used to uniquely identify a class loader
 116                               // class loader or a canonical class path
 117   Dependencies _dependencies; // holds dependencies from this class loader
 118                               // data to others.
 119 
 120   Metaspace * _metaspace;  // Meta-space where meta-data defined by the
 121                            // classes in the class loader are allocated.
 122   Mutex* _metaspace_lock;  // Locks the metaspace for allocations and setup.


 133   // These method IDs are created for the class loader and set to NULL when the
 134   // class loader is unloaded.  They are rarely freed, only for redefine classes
 135   // and if they lose a data race in InstanceKlass.
 136   JNIMethodBlock*                  _jmethod_ids;
 137 
 138   // Metadata to be deallocated when it's safe at class unloading, when
 139   // this class loader isn't unloaded itself.
 140   GrowableArray<Metadata*>*      _deallocate_list;
 141 
 142   // Support for walking class loader data objects
 143   ClassLoaderData* _next; /// Next loader_datas created
 144 
 145   // ReadOnly and ReadWrite metaspaces (static because only on the null
 146   // class loader for now).
 147   static Metaspace* _ro_metaspace;
 148   static Metaspace* _rw_metaspace;
 149 
 150   void set_next(ClassLoaderData* next) { _next = next; }
 151   ClassLoaderData* next() const        { return _next; }
 152 
 153   ClassLoaderData(Handle h_class_loader, bool is_anonymous);
 154   ~ClassLoaderData();
 155 
 156   void set_metaspace(Metaspace* m) { _metaspace = m; }
 157 
 158   JNIHandleBlock* handles() const;
 159   void set_handles(JNIHandleBlock* handles);
 160 
 161   Mutex* metaspace_lock() const { return _metaspace_lock; }
 162 
 163   // GC interface.
 164   void clear_claimed()          { _claimed = 0; }
 165   bool claimed() const          { return _claimed == 1; }
 166   bool claim();
 167 
 168   void unload();
 169   bool keep_alive() const       { return _keep_alive; }
 170   bool is_alive(BoolObjectClosure* is_alive_closure) const;
 171 
 172   void classes_do(void f(InstanceKlass*));
 173 
 174   // Deallocate free list during class unloading.
 175   void free_deallocate_list();
 176 
 177   // Allocate out of this class loader data
 178   MetaWord* allocate(size_t size);
 179 
 180  public:
 181   // Accessors
 182   Metaspace* metaspace_or_null() const     { return _metaspace; }
 183 
 184   static ClassLoaderData* the_null_class_loader_data() {
 185     return _the_null_class_loader_data;
 186   }
 187 
 188   bool is_anonymous() const { return _is_anonymous; }
 189 
 190   static void init_null_class_loader_data() {
 191     assert(_the_null_class_loader_data == NULL, "cannot initialize twice");
 192     assert(ClassLoaderDataGraph::_head == NULL, "cannot initialize twice");
 193     _the_null_class_loader_data = new ClassLoaderData((oop)NULL, false);


 194     ClassLoaderDataGraph::_head = _the_null_class_loader_data;
 195     assert(_the_null_class_loader_data->is_the_null_class_loader_data(), "Must be");
 196     if (DumpSharedSpaces) {
 197       _the_null_class_loader_data->initialize_shared_metaspaces();
 198     }
 199   }
 200 
 201   bool is_the_null_class_loader_data() const {
 202     return this == _the_null_class_loader_data;
 203   }
 204   bool is_ext_class_loader_data() const;
 205 
 206   // The Metaspace is created lazily so may be NULL.  This
 207   // method will allocate a Metaspace if needed.
 208   Metaspace* metaspace_non_null();
 209 
 210   oop class_loader() const      { return _class_loader; }
 211 
 212   // Returns true if this class loader data is for a loader going away.
 213   bool is_unloading() const     {




  83 
  84 #ifndef PRODUCT
  85   // expensive test for pointer in metaspace for debugging
  86   static bool contains(address x);
  87   static bool contains_loader_data(ClassLoaderData* loader_data);
  88 #endif
  89 };
  90 
  91 // ClassLoaderData class
  92 
  93 class ClassLoaderData : public CHeapObj<mtClass> {
  94   friend class VMStructs;
  95  private:
  96   class Dependencies VALUE_OBJ_CLASS_SPEC {
  97     objArrayOop _list_head;
  98     void locked_add(objArrayHandle last,
  99                     objArrayHandle new_dependency,
 100                     Thread* THREAD);
 101    public:
 102     Dependencies() : _list_head(NULL) {}
 103     Dependencies(TRAPS) : _list_head(NULL) {
 104       init(CHECK);
 105     }
 106     void add(Handle dependency, TRAPS);
 107     void init(TRAPS);
 108     void oops_do(OopClosure* f);
 109   };
 110 
 111   friend class ClassLoaderDataGraph;
 112   friend class ClassLoaderDataGraphMetaspaceIterator;
 113   friend class MetaDataFactory;
 114   friend class Method;
 115 
 116   static ClassLoaderData * _the_null_class_loader_data;
 117 
 118   oop _class_loader;          // oop used to uniquely identify a class loader
 119                               // class loader or a canonical class path
 120   Dependencies _dependencies; // holds dependencies from this class loader
 121                               // data to others.
 122 
 123   Metaspace * _metaspace;  // Meta-space where meta-data defined by the
 124                            // classes in the class loader are allocated.
 125   Mutex* _metaspace_lock;  // Locks the metaspace for allocations and setup.


 136   // These method IDs are created for the class loader and set to NULL when the
 137   // class loader is unloaded.  They are rarely freed, only for redefine classes
 138   // and if they lose a data race in InstanceKlass.
 139   JNIMethodBlock*                  _jmethod_ids;
 140 
 141   // Metadata to be deallocated when it's safe at class unloading, when
 142   // this class loader isn't unloaded itself.
 143   GrowableArray<Metadata*>*      _deallocate_list;
 144 
 145   // Support for walking class loader data objects
 146   ClassLoaderData* _next; /// Next loader_datas created
 147 
 148   // ReadOnly and ReadWrite metaspaces (static because only on the null
 149   // class loader for now).
 150   static Metaspace* _ro_metaspace;
 151   static Metaspace* _rw_metaspace;
 152 
 153   void set_next(ClassLoaderData* next) { _next = next; }
 154   ClassLoaderData* next() const        { return _next; }
 155 
 156   ClassLoaderData(Handle h_class_loader, bool is_anonymous, Dependencies dependencies);
 157   ~ClassLoaderData();
 158 
 159   void set_metaspace(Metaspace* m) { _metaspace = m; }
 160 
 161   JNIHandleBlock* handles() const;
 162   void set_handles(JNIHandleBlock* handles);
 163 
 164   Mutex* metaspace_lock() const { return _metaspace_lock; }
 165 
 166   // GC interface.
 167   void clear_claimed()          { _claimed = 0; }
 168   bool claimed() const          { return _claimed == 1; }
 169   bool claim();
 170 
 171   void unload();
 172   bool keep_alive() const       { return _keep_alive; }
 173   bool is_alive(BoolObjectClosure* is_alive_closure) const;
 174 
 175   void classes_do(void f(InstanceKlass*));
 176 
 177   // Deallocate free list during class unloading.
 178   void free_deallocate_list();
 179 
 180   // Allocate out of this class loader data
 181   MetaWord* allocate(size_t size);
 182 
 183  public:
 184   // Accessors
 185   Metaspace* metaspace_or_null() const     { return _metaspace; }
 186 
 187   static ClassLoaderData* the_null_class_loader_data() {
 188     return _the_null_class_loader_data;
 189   }
 190 
 191   bool is_anonymous() const { return _is_anonymous; }
 192 
 193   static void init_null_class_loader_data() {
 194     assert(_the_null_class_loader_data == NULL, "cannot initialize twice");
 195     assert(ClassLoaderDataGraph::_head == NULL, "cannot initialize twice");
 196 
 197     // We explicitly initialize the Dependencies object at a later phase in the initialization
 198     _the_null_class_loader_data = new ClassLoaderData((oop)NULL, false, Dependencies());
 199     ClassLoaderDataGraph::_head = _the_null_class_loader_data;
 200     assert(_the_null_class_loader_data->is_the_null_class_loader_data(), "Must be");
 201     if (DumpSharedSpaces) {
 202       _the_null_class_loader_data->initialize_shared_metaspaces();
 203     }
 204   }
 205 
 206   bool is_the_null_class_loader_data() const {
 207     return this == _the_null_class_loader_data;
 208   }
 209   bool is_ext_class_loader_data() const;
 210 
 211   // The Metaspace is created lazily so may be NULL.  This
 212   // method will allocate a Metaspace if needed.
 213   Metaspace* metaspace_non_null();
 214 
 215   oop class_loader() const      { return _class_loader; }
 216 
 217   // Returns true if this class loader data is for a loader going away.
 218   bool is_unloading() const     {