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
|