comparison src/share/vm/classfile/classLoaderData.hpp @ 9075:ba42fd5e00e6

8010196: NPG: Internal Error: Metaspace allocation lock -- possible deadlock Summary: Refactor the CLD dependency list into a separate class. Use an ObjectLocker to synchronize additions to the CLD dependency list. Reviewed-by: stefank, coleenp
author mgerdin
date Wed, 10 Apr 2013 13:27:35 +0200
parents 16885e702c88
children 1cb4795305b9
comparison
equal deleted inserted replaced
9074:63f57a8c5283 9075:ba42fd5e00e6
91 // ClassLoaderData class 91 // ClassLoaderData class
92 92
93 class ClassLoaderData : public CHeapObj<mtClass> { 93 class ClassLoaderData : public CHeapObj<mtClass> {
94 friend class VMStructs; 94 friend class VMStructs;
95 private: 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
96 friend class ClassLoaderDataGraph; 108 friend class ClassLoaderDataGraph;
97 friend class ClassLoaderDataGraphMetaspaceIterator; 109 friend class ClassLoaderDataGraphMetaspaceIterator;
98 friend class MetaDataFactory; 110 friend class MetaDataFactory;
99 friend class Method; 111 friend class Method;
100 112
101 static ClassLoaderData * _the_null_class_loader_data; 113 static ClassLoaderData * _the_null_class_loader_data;
102 114
103 oop _class_loader; // oop used to uniquely identify a class loader 115 oop _class_loader; // oop used to uniquely identify a class loader
104 // class loader or a canonical class path 116 // class loader or a canonical class path
105 oop _dependencies; // oop to hold dependencies from this class loader 117 Dependencies _dependencies; // holds dependencies from this class loader
106 // data to others. 118 // data to others.
119
107 Metaspace * _metaspace; // Meta-space where meta-data defined by the 120 Metaspace * _metaspace; // Meta-space where meta-data defined by the
108 // classes in the class loader are allocated. 121 // classes in the class loader are allocated.
109 Mutex* _metaspace_lock; // Locks the metaspace for allocations and setup. 122 Mutex* _metaspace_lock; // Locks the metaspace for allocations and setup.
110 bool _unloading; // true if this class loader goes away 123 bool _unloading; // true if this class loader goes away
111 bool _keep_alive; // if this CLD can be unloaded for anonymous loaders 124 bool _keep_alive; // if this CLD can be unloaded for anonymous loaders
131 144
132 // ReadOnly and ReadWrite metaspaces (static because only on the null 145 // ReadOnly and ReadWrite metaspaces (static because only on the null
133 // class loader for now). 146 // class loader for now).
134 static Metaspace* _ro_metaspace; 147 static Metaspace* _ro_metaspace;
135 static Metaspace* _rw_metaspace; 148 static Metaspace* _rw_metaspace;
136
137 void add_dependency(Handle dependency, TRAPS);
138 void locked_add_dependency(objArrayHandle last, objArrayHandle new_dependency);
139 149
140 void set_next(ClassLoaderData* next) { _next = next; } 150 void set_next(ClassLoaderData* next) { _next = next; }
141 ClassLoaderData* next() const { return _next; } 151 ClassLoaderData* next() const { return _next; }
142 152
143 ClassLoaderData(Handle h_class_loader, bool is_anonymous); 153 ClassLoaderData(Handle h_class_loader, bool is_anonymous);