Mercurial > hg > graal-compiler
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); |