< prev index next >

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

Print this page




  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 "classfile/classLoaderData.hpp"
  29 #include "memory/iterator.hpp"
  30 #include "oops/access.inline.hpp"
  31 #include "oops/compressedOops.inline.hpp"
  32 #include "oops/klass.hpp"
  33 #include "oops/instanceKlass.inline.hpp"
  34 #include "oops/instanceMirrorKlass.inline.hpp"
  35 #include "oops/instanceClassLoaderKlass.inline.hpp"
  36 #include "oops/instanceRefKlass.inline.hpp"
  37 #include "oops/objArrayKlass.inline.hpp"
  38 #include "oops/typeArrayKlass.inline.hpp"

  39 #include "utilities/debug.hpp"
  40 
  41 inline void MetadataVisitingOopIterateClosure::do_cld(ClassLoaderData* cld) {
  42   cld->oops_do(this, ClassLoaderData::_claim_strong);
  43 }
  44 
  45 inline void MetadataVisitingOopIterateClosure::do_klass(Klass* k) {
  46   ClassLoaderData* cld = k->class_loader_data();
  47   MetadataVisitingOopIterateClosure::do_cld(cld);
  48 }
  49 
  50 #ifdef ASSERT
  51 // This verification is applied to all visited oops.
  52 // The closures can turn is off by overriding should_verify_oops().
  53 template <typename T>
  54 void OopIterateClosure::verify(T* p) {
  55   if (should_verify_oops()) {
  56     T heap_oop = RawAccess<>::oop_load(p);
  57     if (!CompressedOops::is_null(heap_oop)) {
  58       oop o = CompressedOops::decode_not_null(heap_oop);


 253         _function[KlassType::ID] = &oop_oop_iterate<KlassType, oop>;
 254       }
 255     }
 256 
 257     template <typename KlassType>
 258     void set_resolve_function_and_execute(OopClosureType* cl, oop obj, Klass* k) {
 259       set_resolve_function<KlassType>();
 260       _function[KlassType::ID](cl, obj, k);
 261     }
 262 
 263   public:
 264     void (*_function[KLASS_ID_COUNT])(OopClosureType*, oop, Klass*);
 265 
 266     Table(){
 267       set_init_function<InstanceKlass>();
 268       set_init_function<InstanceRefKlass>();
 269       set_init_function<InstanceMirrorKlass>();
 270       set_init_function<InstanceClassLoaderKlass>();
 271       set_init_function<ObjArrayKlass>();
 272       set_init_function<TypeArrayKlass>();

 273     }
 274   };
 275 
 276   static Table _table;
 277 public:
 278 
 279   static void (*function(Klass* klass))(OopClosureType*, oop, Klass*) {
 280     return _table._function[klass->id()];
 281   }
 282 };
 283 
 284 template <typename OopClosureType>
 285 typename OopOopIterateDispatch<OopClosureType>::Table OopOopIterateDispatch<OopClosureType>::_table;
 286 
 287 
 288 template <typename OopClosureType>
 289 class OopOopIterateBoundedDispatch {
 290 private:
 291   class Table {
 292   private:


 313         _function[KlassType::ID] = &oop_oop_iterate_bounded<KlassType, oop>;
 314       }
 315     }
 316 
 317     template <typename KlassType>
 318     void set_resolve_function_and_execute(OopClosureType* cl, oop obj, Klass* k, MemRegion mr) {
 319       set_resolve_function<KlassType>();
 320       _function[KlassType::ID](cl, obj, k, mr);
 321     }
 322 
 323   public:
 324     void (*_function[KLASS_ID_COUNT])(OopClosureType*, oop, Klass*, MemRegion);
 325 
 326     Table(){
 327       set_init_function<InstanceKlass>();
 328       set_init_function<InstanceRefKlass>();
 329       set_init_function<InstanceMirrorKlass>();
 330       set_init_function<InstanceClassLoaderKlass>();
 331       set_init_function<ObjArrayKlass>();
 332       set_init_function<TypeArrayKlass>();

 333     }
 334   };
 335 
 336   static Table _table;
 337 public:
 338 
 339   static void (*function(Klass* klass))(OopClosureType*, oop, Klass*, MemRegion) {
 340     return _table._function[klass->id()];
 341   }
 342 };
 343 
 344 template <typename OopClosureType>
 345 typename OopOopIterateBoundedDispatch<OopClosureType>::Table OopOopIterateBoundedDispatch<OopClosureType>::_table;
 346 
 347 
 348 template <typename OopClosureType>
 349 class OopOopIterateBackwardsDispatch {
 350 private:
 351   class Table {
 352   private:


 373         _function[KlassType::ID] = &oop_oop_iterate_backwards<KlassType, oop>;
 374       }
 375     }
 376 
 377     template <typename KlassType>
 378     void set_resolve_function_and_execute(OopClosureType* cl, oop obj, Klass* k) {
 379       set_resolve_function<KlassType>();
 380       _function[KlassType::ID](cl, obj, k);
 381     }
 382 
 383   public:
 384     void (*_function[KLASS_ID_COUNT])(OopClosureType*, oop, Klass*);
 385 
 386     Table(){
 387       set_init_function<InstanceKlass>();
 388       set_init_function<InstanceRefKlass>();
 389       set_init_function<InstanceMirrorKlass>();
 390       set_init_function<InstanceClassLoaderKlass>();
 391       set_init_function<ObjArrayKlass>();
 392       set_init_function<TypeArrayKlass>();

 393     }
 394   };
 395 
 396   static Table _table;
 397 public:
 398 
 399   static void (*function(Klass* klass))(OopClosureType*, oop, Klass*) {
 400     return _table._function[klass->id()];
 401   }
 402 };
 403 
 404 template <typename OopClosureType>
 405 typename OopOopIterateBackwardsDispatch<OopClosureType>::Table OopOopIterateBackwardsDispatch<OopClosureType>::_table;
 406 
 407 
 408 template <typename OopClosureType>
 409 void OopIteratorClosureDispatch::oop_oop_iterate(OopClosureType* cl, oop obj, Klass* klass) {
 410   OopOopIterateDispatch<OopClosureType>::function(klass)(cl, obj, klass);
 411 }
 412 


  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 "classfile/classLoaderData.hpp"
  29 #include "memory/iterator.hpp"
  30 #include "oops/access.inline.hpp"
  31 #include "oops/compressedOops.inline.hpp"
  32 #include "oops/klass.hpp"
  33 #include "oops/instanceKlass.inline.hpp"
  34 #include "oops/instanceMirrorKlass.inline.hpp"
  35 #include "oops/instanceClassLoaderKlass.inline.hpp"
  36 #include "oops/instanceRefKlass.inline.hpp"
  37 #include "oops/objArrayKlass.inline.hpp"
  38 #include "oops/typeArrayKlass.inline.hpp"
  39 #include "oops/valueArrayKlass.inline.hpp"
  40 #include "utilities/debug.hpp"
  41 
  42 inline void MetadataVisitingOopIterateClosure::do_cld(ClassLoaderData* cld) {
  43   cld->oops_do(this, ClassLoaderData::_claim_strong);
  44 }
  45 
  46 inline void MetadataVisitingOopIterateClosure::do_klass(Klass* k) {
  47   ClassLoaderData* cld = k->class_loader_data();
  48   MetadataVisitingOopIterateClosure::do_cld(cld);
  49 }
  50 
  51 #ifdef ASSERT
  52 // This verification is applied to all visited oops.
  53 // The closures can turn is off by overriding should_verify_oops().
  54 template <typename T>
  55 void OopIterateClosure::verify(T* p) {
  56   if (should_verify_oops()) {
  57     T heap_oop = RawAccess<>::oop_load(p);
  58     if (!CompressedOops::is_null(heap_oop)) {
  59       oop o = CompressedOops::decode_not_null(heap_oop);


 254         _function[KlassType::ID] = &oop_oop_iterate<KlassType, oop>;
 255       }
 256     }
 257 
 258     template <typename KlassType>
 259     void set_resolve_function_and_execute(OopClosureType* cl, oop obj, Klass* k) {
 260       set_resolve_function<KlassType>();
 261       _function[KlassType::ID](cl, obj, k);
 262     }
 263 
 264   public:
 265     void (*_function[KLASS_ID_COUNT])(OopClosureType*, oop, Klass*);
 266 
 267     Table(){
 268       set_init_function<InstanceKlass>();
 269       set_init_function<InstanceRefKlass>();
 270       set_init_function<InstanceMirrorKlass>();
 271       set_init_function<InstanceClassLoaderKlass>();
 272       set_init_function<ObjArrayKlass>();
 273       set_init_function<TypeArrayKlass>();
 274       set_init_function<ValueArrayKlass>();
 275     }
 276   };
 277 
 278   static Table _table;
 279 public:
 280 
 281   static void (*function(Klass* klass))(OopClosureType*, oop, Klass*) {
 282     return _table._function[klass->id()];
 283   }
 284 };
 285 
 286 template <typename OopClosureType>
 287 typename OopOopIterateDispatch<OopClosureType>::Table OopOopIterateDispatch<OopClosureType>::_table;
 288 
 289 
 290 template <typename OopClosureType>
 291 class OopOopIterateBoundedDispatch {
 292 private:
 293   class Table {
 294   private:


 315         _function[KlassType::ID] = &oop_oop_iterate_bounded<KlassType, oop>;
 316       }
 317     }
 318 
 319     template <typename KlassType>
 320     void set_resolve_function_and_execute(OopClosureType* cl, oop obj, Klass* k, MemRegion mr) {
 321       set_resolve_function<KlassType>();
 322       _function[KlassType::ID](cl, obj, k, mr);
 323     }
 324 
 325   public:
 326     void (*_function[KLASS_ID_COUNT])(OopClosureType*, oop, Klass*, MemRegion);
 327 
 328     Table(){
 329       set_init_function<InstanceKlass>();
 330       set_init_function<InstanceRefKlass>();
 331       set_init_function<InstanceMirrorKlass>();
 332       set_init_function<InstanceClassLoaderKlass>();
 333       set_init_function<ObjArrayKlass>();
 334       set_init_function<TypeArrayKlass>();
 335       set_init_function<ValueArrayKlass>();
 336     }
 337   };
 338 
 339   static Table _table;
 340 public:
 341 
 342   static void (*function(Klass* klass))(OopClosureType*, oop, Klass*, MemRegion) {
 343     return _table._function[klass->id()];
 344   }
 345 };
 346 
 347 template <typename OopClosureType>
 348 typename OopOopIterateBoundedDispatch<OopClosureType>::Table OopOopIterateBoundedDispatch<OopClosureType>::_table;
 349 
 350 
 351 template <typename OopClosureType>
 352 class OopOopIterateBackwardsDispatch {
 353 private:
 354   class Table {
 355   private:


 376         _function[KlassType::ID] = &oop_oop_iterate_backwards<KlassType, oop>;
 377       }
 378     }
 379 
 380     template <typename KlassType>
 381     void set_resolve_function_and_execute(OopClosureType* cl, oop obj, Klass* k) {
 382       set_resolve_function<KlassType>();
 383       _function[KlassType::ID](cl, obj, k);
 384     }
 385 
 386   public:
 387     void (*_function[KLASS_ID_COUNT])(OopClosureType*, oop, Klass*);
 388 
 389     Table(){
 390       set_init_function<InstanceKlass>();
 391       set_init_function<InstanceRefKlass>();
 392       set_init_function<InstanceMirrorKlass>();
 393       set_init_function<InstanceClassLoaderKlass>();
 394       set_init_function<ObjArrayKlass>();
 395       set_init_function<TypeArrayKlass>();
 396       set_init_function<ValueArrayKlass>();
 397     }
 398   };
 399 
 400   static Table _table;
 401 public:
 402 
 403   static void (*function(Klass* klass))(OopClosureType*, oop, Klass*) {
 404     return _table._function[klass->id()];
 405   }
 406 };
 407 
 408 template <typename OopClosureType>
 409 typename OopOopIterateBackwardsDispatch<OopClosureType>::Table OopOopIterateBackwardsDispatch<OopClosureType>::_table;
 410 
 411 
 412 template <typename OopClosureType>
 413 void OopIteratorClosureDispatch::oop_oop_iterate(OopClosureType* cl, oop obj, Klass* klass) {
 414   OopOopIterateDispatch<OopClosureType>::function(klass)(cl, obj, klass);
 415 }
 416 
< prev index next >