< prev index next >

src/hotspot/share/memory/iterator.inline.hpp

Print this page

 16  * 2 along with this work; if not, write to the Free Software Foundation,
 17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 18  *
 19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 20  * or visit www.oracle.com if you need additional information or have any
 21  * questions.
 22  *
 23  */
 24 
 25 #ifndef SHARE_MEMORY_ITERATOR_INLINE_HPP
 26 #define SHARE_MEMORY_ITERATOR_INLINE_HPP
 27 
 28 #include "memory/iterator.hpp"
 29 
 30 #include "cds/aotLinkedClassBulkLoader.hpp"
 31 #include "classfile/classLoaderData.hpp"
 32 #include "code/nmethod.hpp"
 33 #include "oops/access.inline.hpp"
 34 #include "oops/compressedOops.inline.hpp"
 35 #include "oops/klass.hpp"

 36 #include "oops/instanceKlass.inline.hpp"
 37 #include "oops/instanceMirrorKlass.inline.hpp"
 38 #include "oops/instanceClassLoaderKlass.inline.hpp"
 39 #include "oops/instanceRefKlass.inline.hpp"
 40 #include "oops/instanceStackChunkKlass.inline.hpp"
 41 #include "oops/objArrayKlass.inline.hpp"
 42 #include "oops/typeArrayKlass.inline.hpp"
 43 #include "utilities/debug.hpp"
 44 
 45 // Defaults to strong claiming.
 46 inline MetadataVisitingOopIterateClosure::MetadataVisitingOopIterateClosure(ReferenceDiscoverer* rd) :
 47     ClaimMetadataVisitingOopIterateClosure(ClassLoaderData::_claim_strong, rd) {}
 48 
 49 inline void ClaimMetadataVisitingOopIterateClosure::do_cld(ClassLoaderData* cld) {
 50   cld->oops_do(this, _claim);
 51 }
 52 
 53 inline void ClaimMetadataVisitingOopIterateClosure::do_klass(Klass* k) {
 54   ClassLoaderData* cld = k->class_loader_data();
 55   if (cld != nullptr) {

131       // when functions pointers are updated.
132       STATIC_ASSERT(sizeof(_function[0]) == sizeof(void*));
133       if (UseCompressedOops) {
134         _function[KlassType::Kind] = &oop_oop_iterate<KlassType, narrowOop>;
135       } else {
136         _function[KlassType::Kind] = &oop_oop_iterate<KlassType, oop>;
137       }
138     }
139 
140     template <typename KlassType>
141     void set_resolve_function_and_execute(OopClosureType* cl, oop obj, Klass* k) {
142       set_resolve_function<KlassType>();
143       _function[KlassType::Kind](cl, obj, k);
144     }
145 
146   public:
147     FunctionType _function[Klass::KLASS_KIND_COUNT];
148 
149     Table(){
150       set_init_function<InstanceKlass>();

151       set_init_function<InstanceRefKlass>();
152       set_init_function<InstanceMirrorKlass>();
153       set_init_function<InstanceClassLoaderKlass>();
154       set_init_function<InstanceStackChunkKlass>();
155       set_init_function<ObjArrayKlass>();
156       set_init_function<TypeArrayKlass>();

157     }
158   };
159 
160   static Table _table;
161 public:
162 
163   static FunctionType function(Klass* klass) {
164     return _table._function[klass->kind()];
165   }
166 };
167 
168 template <typename OopClosureType>
169 typename OopOopIterateDispatch<OopClosureType>::Table OopOopIterateDispatch<OopClosureType>::_table;
170 
171 
172 template <typename OopClosureType>
173 class OopOopIterateBoundedDispatch {
174 private:
175   typedef void (*FunctionType)(OopClosureType*, oop, Klass*, MemRegion);
176 

194     template <typename KlassType>
195     void set_resolve_function() {
196       if (UseCompressedOops) {
197         _function[KlassType::Kind] = &oop_oop_iterate_bounded<KlassType, narrowOop>;
198       } else {
199         _function[KlassType::Kind] = &oop_oop_iterate_bounded<KlassType, oop>;
200       }
201     }
202 
203     template <typename KlassType>
204     void set_resolve_function_and_execute(OopClosureType* cl, oop obj, Klass* k, MemRegion mr) {
205       set_resolve_function<KlassType>();
206       _function[KlassType::Kind](cl, obj, k, mr);
207     }
208 
209   public:
210     FunctionType _function[Klass::KLASS_KIND_COUNT];
211 
212     Table(){
213       set_init_function<InstanceKlass>();

214       set_init_function<InstanceRefKlass>();
215       set_init_function<InstanceMirrorKlass>();
216       set_init_function<InstanceClassLoaderKlass>();
217       set_init_function<InstanceStackChunkKlass>();
218       set_init_function<ObjArrayKlass>();
219       set_init_function<TypeArrayKlass>();

220     }
221   };
222 
223   static Table _table;
224 public:
225 
226   static FunctionType function(Klass* klass) {
227     return _table._function[klass->kind()];
228   }
229 };
230 
231 template <typename OopClosureType>
232 typename OopOopIterateBoundedDispatch<OopClosureType>::Table OopOopIterateBoundedDispatch<OopClosureType>::_table;
233 
234 
235 template <typename OopClosureType>
236 class OopOopIterateBackwardsDispatch {
237 private:
238   typedef void (*FunctionType)(OopClosureType*, oop, Klass*);
239 

257     template <typename KlassType>
258     void set_resolve_function() {
259       if (UseCompressedOops) {
260         _function[KlassType::Kind] = &oop_oop_iterate_backwards<KlassType, narrowOop>;
261       } else {
262         _function[KlassType::Kind] = &oop_oop_iterate_backwards<KlassType, oop>;
263       }
264     }
265 
266     template <typename KlassType>
267     void set_resolve_function_and_execute(OopClosureType* cl, oop obj, Klass* k) {
268       set_resolve_function<KlassType>();
269       _function[KlassType::Kind](cl, obj, k);
270     }
271 
272   public:
273     FunctionType _function[Klass::KLASS_KIND_COUNT];
274 
275     Table(){
276       set_init_function<InstanceKlass>();

277       set_init_function<InstanceRefKlass>();
278       set_init_function<InstanceMirrorKlass>();
279       set_init_function<InstanceClassLoaderKlass>();
280       set_init_function<InstanceStackChunkKlass>();
281       set_init_function<ObjArrayKlass>();
282       set_init_function<TypeArrayKlass>();

283     }
284   };
285 
286   static Table _table;
287 public:
288 
289   static FunctionType function(Klass* klass) {
290     return _table._function[klass->kind()];
291   }
292 };
293 
294 template <typename OopClosureType>
295 typename OopOopIterateBackwardsDispatch<OopClosureType>::Table OopOopIterateBackwardsDispatch<OopClosureType>::_table;
296 
297 
298 template <typename OopClosureType>
299 void OopIteratorClosureDispatch::oop_oop_iterate(OopClosureType* cl, oop obj, Klass* klass) {
300   OopOopIterateDispatch<OopClosureType>::function(klass)(cl, obj, klass);
301 }
302 

 16  * 2 along with this work; if not, write to the Free Software Foundation,
 17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 18  *
 19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 20  * or visit www.oracle.com if you need additional information or have any
 21  * questions.
 22  *
 23  */
 24 
 25 #ifndef SHARE_MEMORY_ITERATOR_INLINE_HPP
 26 #define SHARE_MEMORY_ITERATOR_INLINE_HPP
 27 
 28 #include "memory/iterator.hpp"
 29 
 30 #include "cds/aotLinkedClassBulkLoader.hpp"
 31 #include "classfile/classLoaderData.hpp"
 32 #include "code/nmethod.hpp"
 33 #include "oops/access.inline.hpp"
 34 #include "oops/compressedOops.inline.hpp"
 35 #include "oops/klass.hpp"
 36 #include "oops/flatArrayKlass.inline.hpp"
 37 #include "oops/instanceKlass.inline.hpp"
 38 #include "oops/instanceMirrorKlass.inline.hpp"
 39 #include "oops/instanceClassLoaderKlass.inline.hpp"
 40 #include "oops/instanceRefKlass.inline.hpp"
 41 #include "oops/instanceStackChunkKlass.inline.hpp"
 42 #include "oops/objArrayKlass.inline.hpp"
 43 #include "oops/typeArrayKlass.inline.hpp"
 44 #include "utilities/debug.hpp"
 45 
 46 // Defaults to strong claiming.
 47 inline MetadataVisitingOopIterateClosure::MetadataVisitingOopIterateClosure(ReferenceDiscoverer* rd) :
 48     ClaimMetadataVisitingOopIterateClosure(ClassLoaderData::_claim_strong, rd) {}
 49 
 50 inline void ClaimMetadataVisitingOopIterateClosure::do_cld(ClassLoaderData* cld) {
 51   cld->oops_do(this, _claim);
 52 }
 53 
 54 inline void ClaimMetadataVisitingOopIterateClosure::do_klass(Klass* k) {
 55   ClassLoaderData* cld = k->class_loader_data();
 56   if (cld != nullptr) {

132       // when functions pointers are updated.
133       STATIC_ASSERT(sizeof(_function[0]) == sizeof(void*));
134       if (UseCompressedOops) {
135         _function[KlassType::Kind] = &oop_oop_iterate<KlassType, narrowOop>;
136       } else {
137         _function[KlassType::Kind] = &oop_oop_iterate<KlassType, oop>;
138       }
139     }
140 
141     template <typename KlassType>
142     void set_resolve_function_and_execute(OopClosureType* cl, oop obj, Klass* k) {
143       set_resolve_function<KlassType>();
144       _function[KlassType::Kind](cl, obj, k);
145     }
146 
147   public:
148     FunctionType _function[Klass::KLASS_KIND_COUNT];
149 
150     Table(){
151       set_init_function<InstanceKlass>();
152       set_init_function<InlineKlass>();
153       set_init_function<InstanceRefKlass>();
154       set_init_function<InstanceMirrorKlass>();
155       set_init_function<InstanceClassLoaderKlass>();
156       set_init_function<InstanceStackChunkKlass>();
157       set_init_function<ObjArrayKlass>();
158       set_init_function<TypeArrayKlass>();
159       set_init_function<FlatArrayKlass>();
160     }
161   };
162 
163   static Table _table;
164 public:
165 
166   static FunctionType function(Klass* klass) {
167     return _table._function[klass->kind()];
168   }
169 };
170 
171 template <typename OopClosureType>
172 typename OopOopIterateDispatch<OopClosureType>::Table OopOopIterateDispatch<OopClosureType>::_table;
173 
174 
175 template <typename OopClosureType>
176 class OopOopIterateBoundedDispatch {
177 private:
178   typedef void (*FunctionType)(OopClosureType*, oop, Klass*, MemRegion);
179 

197     template <typename KlassType>
198     void set_resolve_function() {
199       if (UseCompressedOops) {
200         _function[KlassType::Kind] = &oop_oop_iterate_bounded<KlassType, narrowOop>;
201       } else {
202         _function[KlassType::Kind] = &oop_oop_iterate_bounded<KlassType, oop>;
203       }
204     }
205 
206     template <typename KlassType>
207     void set_resolve_function_and_execute(OopClosureType* cl, oop obj, Klass* k, MemRegion mr) {
208       set_resolve_function<KlassType>();
209       _function[KlassType::Kind](cl, obj, k, mr);
210     }
211 
212   public:
213     FunctionType _function[Klass::KLASS_KIND_COUNT];
214 
215     Table(){
216       set_init_function<InstanceKlass>();
217       set_init_function<InlineKlass>();
218       set_init_function<InstanceRefKlass>();
219       set_init_function<InstanceMirrorKlass>();
220       set_init_function<InstanceClassLoaderKlass>();
221       set_init_function<InstanceStackChunkKlass>();
222       set_init_function<ObjArrayKlass>();
223       set_init_function<TypeArrayKlass>();
224       set_init_function<FlatArrayKlass>();
225     }
226   };
227 
228   static Table _table;
229 public:
230 
231   static FunctionType function(Klass* klass) {
232     return _table._function[klass->kind()];
233   }
234 };
235 
236 template <typename OopClosureType>
237 typename OopOopIterateBoundedDispatch<OopClosureType>::Table OopOopIterateBoundedDispatch<OopClosureType>::_table;
238 
239 
240 template <typename OopClosureType>
241 class OopOopIterateBackwardsDispatch {
242 private:
243   typedef void (*FunctionType)(OopClosureType*, oop, Klass*);
244 

262     template <typename KlassType>
263     void set_resolve_function() {
264       if (UseCompressedOops) {
265         _function[KlassType::Kind] = &oop_oop_iterate_backwards<KlassType, narrowOop>;
266       } else {
267         _function[KlassType::Kind] = &oop_oop_iterate_backwards<KlassType, oop>;
268       }
269     }
270 
271     template <typename KlassType>
272     void set_resolve_function_and_execute(OopClosureType* cl, oop obj, Klass* k) {
273       set_resolve_function<KlassType>();
274       _function[KlassType::Kind](cl, obj, k);
275     }
276 
277   public:
278     FunctionType _function[Klass::KLASS_KIND_COUNT];
279 
280     Table(){
281       set_init_function<InstanceKlass>();
282       set_init_function<InlineKlass>();
283       set_init_function<InstanceRefKlass>();
284       set_init_function<InstanceMirrorKlass>();
285       set_init_function<InstanceClassLoaderKlass>();
286       set_init_function<InstanceStackChunkKlass>();
287       set_init_function<ObjArrayKlass>();
288       set_init_function<TypeArrayKlass>();
289       set_init_function<FlatArrayKlass>();
290     }
291   };
292 
293   static Table _table;
294 public:
295 
296   static FunctionType function(Klass* klass) {
297     return _table._function[klass->kind()];
298   }
299 };
300 
301 template <typename OopClosureType>
302 typename OopOopIterateBackwardsDispatch<OopClosureType>::Table OopOopIterateBackwardsDispatch<OopClosureType>::_table;
303 
304 
305 template <typename OopClosureType>
306 void OopIteratorClosureDispatch::oop_oop_iterate(OopClosureType* cl, oop obj, Klass* klass) {
307   OopOopIterateDispatch<OopClosureType>::function(klass)(cl, obj, klass);
308 }
309 
< prev index next >