619 } |
619 } |
620 } |
620 } |
621 return (nh); |
621 return (nh); |
622 } |
622 } |
623 |
623 |
624 // utility function for class load event |
|
625 static void post_class_load_event(const Ticks& start_time, |
624 static void post_class_load_event(const Ticks& start_time, |
626 instanceKlassHandle k, |
625 instanceKlassHandle k, |
627 Handle initiating_loader) { |
626 const ClassLoaderData* init_cld) { |
628 #if INCLUDE_TRACE |
627 #if INCLUDE_TRACE |
629 EventClassLoad event(UNTIMED); |
628 EventClassLoad event(UNTIMED); |
630 if (event.should_commit()) { |
629 if (event.should_commit()) { |
631 event.set_starttime(start_time); |
630 event.set_starttime(start_time); |
632 event.set_loadedClass(k()); |
631 event.set_loadedClass(k()); |
633 oop defining_class_loader = k->class_loader(); |
632 event.set_definingClassLoader(k->class_loader_data()); |
634 event.set_definingClassLoader(defining_class_loader != NULL ? |
633 event.set_initiatingClassLoader(init_cld); |
635 defining_class_loader->klass() : (Klass*)NULL); |
|
636 oop class_loader = initiating_loader.is_null() ? (oop)NULL : initiating_loader(); |
|
637 event.set_initiatingClassLoader(class_loader != NULL ? |
|
638 class_loader->klass() : (Klass*)NULL); |
|
639 event.commit(); |
634 event.commit(); |
640 } |
635 } |
641 #endif // INCLUDE_TRACE |
636 #endif // INCLUDE_TRACE |
642 } |
637 } |
643 |
638 |
644 // utility function for class define event |
639 static void class_define_event(instanceKlassHandle k, |
645 static void class_define_event(instanceKlassHandle k) { |
640 const ClassLoaderData* def_cld) { |
646 #if INCLUDE_TRACE |
641 #if INCLUDE_TRACE |
647 EventClassDefine event(UNTIMED); |
642 EventClassDefine event; |
648 if (event.should_commit()) { |
643 if (event.should_commit()) { |
649 event.set_definedClass(k()); |
644 event.set_definedClass(k()); |
650 oop defining_class_loader = k->class_loader(); |
645 event.set_definingClassLoader(def_cld); |
651 event.set_definingClassLoader(defining_class_loader != NULL ? |
|
652 defining_class_loader->klass() : (Klass*)NULL); |
|
653 event.commit(); |
646 event.commit(); |
654 } |
647 } |
655 #endif // INCLUDE_TRACE |
648 #endif // INCLUDE_TRACE |
656 } |
649 } |
657 |
650 |
905 |
898 |
906 if (HAS_PENDING_EXCEPTION || k.is_null()) { |
899 if (HAS_PENDING_EXCEPTION || k.is_null()) { |
907 return NULL; |
900 return NULL; |
908 } |
901 } |
909 |
902 |
910 post_class_load_event(class_load_start_time, k, class_loader); |
903 post_class_load_event(class_load_start_time, k, loader_data); |
911 |
904 |
912 #ifdef ASSERT |
905 #ifdef ASSERT |
913 { |
906 { |
914 ClassLoaderData* loader_data = k->class_loader_data(); |
907 ClassLoaderData* loader_data = k->class_loader_data(); |
915 MutexLocker mu(SystemDictionary_lock, THREAD); |
908 MutexLocker mu(SystemDictionary_lock, THREAD); |
1088 if (JvmtiExport::should_post_class_load()) { |
1081 if (JvmtiExport::should_post_class_load()) { |
1089 assert(THREAD->is_Java_thread(), "thread->is_Java_thread()"); |
1082 assert(THREAD->is_Java_thread(), "thread->is_Java_thread()"); |
1090 JvmtiExport::post_class_load((JavaThread *) THREAD, k()); |
1083 JvmtiExport::post_class_load((JavaThread *) THREAD, k()); |
1091 } |
1084 } |
1092 |
1085 |
1093 post_class_load_event(class_load_start_time, k, class_loader); |
1086 post_class_load_event(class_load_start_time, k, loader_data); |
1094 } |
1087 } |
1095 assert(host_klass != NULL || NULL == cp_patches, |
1088 assert(host_klass != NULL || NULL == cp_patches, |
1096 "cp_patches only found with host_klass"); |
1089 "cp_patches only found with host_klass"); |
1097 |
1090 |
1098 return k(); |
1091 return k(); |
1639 if (JvmtiExport::should_post_class_load()) { |
1632 if (JvmtiExport::should_post_class_load()) { |
1640 assert(THREAD->is_Java_thread(), "thread->is_Java_thread()"); |
1633 assert(THREAD->is_Java_thread(), "thread->is_Java_thread()"); |
1641 JvmtiExport::post_class_load((JavaThread *) THREAD, k()); |
1634 JvmtiExport::post_class_load((JavaThread *) THREAD, k()); |
1642 |
1635 |
1643 } |
1636 } |
1644 class_define_event(k); |
1637 class_define_event(k, loader_data); |
1645 } |
1638 } |
1646 |
1639 |
1647 // Support parallel classloading |
1640 // Support parallel classloading |
1648 // All parallel class loaders, including bootstrap classloader |
1641 // All parallel class loaders, including bootstrap classloader |
1649 // lock a placeholder entry for this class/class_loader pair |
1642 // lock a placeholder entry for this class/class_loader pair |