< prev index next >

src/share/vm/classfile/systemDictionary.cpp

Print this page

        

*** 36,45 **** --- 36,46 ---- #endif #include "classfile/vmSymbols.hpp" #include "compiler/compileBroker.hpp" #include "interpreter/bytecodeStream.hpp" #include "interpreter/interpreter.hpp" + #include "jfr/jfrEvents.hpp" #include "memory/filemap.hpp" #include "memory/gcLocker.hpp" #include "memory/oopFactory.hpp" #include "oops/instanceKlass.hpp" #include "oops/instanceRefKlass.hpp"
*** 62,74 **** #include "runtime/signature.hpp" #include "services/classLoadingService.hpp" #include "services/threadService.hpp" #include "utilities/macros.hpp" #include "utilities/ticks.hpp" - #if INCLUDE_TRACE - #include "trace/tracing.hpp" - #endif Dictionary* SystemDictionary::_dictionary = NULL; PlaceholderTable* SystemDictionary::_placeholders = NULL; Dictionary* SystemDictionary::_shared_dictionary = NULL; LoaderConstraintTable* SystemDictionary::_loader_constraints = NULL; --- 63,72 ----
*** 596,614 **** } } return (nh); } Klass* SystemDictionary::resolve_instance_class_or_null(Symbol* name, Handle class_loader, Handle protection_domain, TRAPS) { assert(name != NULL && !FieldType::is_array(name) && !FieldType::is_obj(name), "invalid class name"); ! Ticks class_load_start_time = Ticks::now(); // UseNewReflection // Fix for 4474172; see evaluation for more details class_loader = Handle(THREAD, java_lang_ClassLoader::non_reflection_class_loader(class_loader())); ClassLoaderData *loader_data = register_loader(class_loader, CHECK_NULL); --- 594,628 ---- } } return (nh); } + // utility function for class load event + static void post_class_load_event(EventClassLoad &event, + instanceKlassHandle k, + Handle initiating_loader) { + #if INCLUDE_JFR + if (event.should_commit()) { + event.set_loadedClass(k()); + event.set_definingClassLoader(k->class_loader_data()); + oop class_loader = initiating_loader.is_null() ? (oop)NULL : initiating_loader(); + event.set_initiatingClassLoader(class_loader != NULL ? + ClassLoaderData::class_loader_data_or_null(class_loader) : + (ClassLoaderData*)NULL); + event.commit(); + } + #endif // INCLUDE_JFR + } Klass* SystemDictionary::resolve_instance_class_or_null(Symbol* name, Handle class_loader, Handle protection_domain, TRAPS) { assert(name != NULL && !FieldType::is_array(name) && !FieldType::is_obj(name), "invalid class name"); ! EventClassLoad class_load_start_event; // UseNewReflection // Fix for 4474172; see evaluation for more details class_loader = Handle(THREAD, java_lang_ClassLoader::non_reflection_class_loader(class_loader())); ClassLoaderData *loader_data = register_loader(class_loader, CHECK_NULL);
*** 846,856 **** if (HAS_PENDING_EXCEPTION || k.is_null()) { return NULL; } ! post_class_load_event(class_load_start_time, k, class_loader); #ifdef ASSERT { ClassLoaderData* loader_data = k->class_loader_data(); MutexLocker mu(SystemDictionary_lock, THREAD); --- 860,870 ---- if (HAS_PENDING_EXCEPTION || k.is_null()) { return NULL; } ! post_class_load_event(class_load_start_event, k, class_loader); #ifdef ASSERT { ClassLoaderData* loader_data = k->class_loader_data(); MutexLocker mu(SystemDictionary_lock, THREAD);
*** 971,981 **** KlassHandle host_klass, GrowableArray<Handle>* cp_patches, TRAPS) { TempNewSymbol parsed_name = NULL; ! Ticks class_load_start_time = Ticks::now(); ClassLoaderData* loader_data; if (host_klass.not_null()) { // Create a new CLD for anonymous class, that uses the same class loader // as the host_klass --- 985,995 ---- KlassHandle host_klass, GrowableArray<Handle>* cp_patches, TRAPS) { TempNewSymbol parsed_name = NULL; ! EventClassLoad class_load_start_event; ClassLoaderData* loader_data; if (host_klass.not_null()) { // Create a new CLD for anonymous class, that uses the same class loader // as the host_klass
*** 1032,1042 **** if (JvmtiExport::should_post_class_load()) { assert(THREAD->is_Java_thread(), "thread->is_Java_thread()"); JvmtiExport::post_class_load((JavaThread *) THREAD, k()); } ! post_class_load_event(class_load_start_time, k, class_loader); } assert(host_klass.not_null() || cp_patches == NULL, "cp_patches only found with host_klass"); return k(); --- 1046,1056 ---- if (JvmtiExport::should_post_class_load()) { assert(THREAD->is_Java_thread(), "thread->is_Java_thread()"); JvmtiExport::post_class_load((JavaThread *) THREAD, k()); } ! post_class_load_event(class_load_start_event, k, class_loader); } assert(host_klass.not_null() || cp_patches == NULL, "cp_patches only found with host_klass"); return k();
*** 1074,1084 **** // already be present in the SystemDictionary, otherwise we would not // throw potential ClassFormatErrors. // // Note: "name" is updated. ! instanceKlassHandle k = ClassFileParser(st).parseClassFile(class_name, loader_data, protection_domain, parsed_name, verify, THREAD); --- 1088,1099 ---- // already be present in the SystemDictionary, otherwise we would not // throw potential ClassFormatErrors. // // Note: "name" is updated. ! ClassFileParser parser(st); ! instanceKlassHandle k = parser.parseClassFile(class_name, loader_data, protection_domain, parsed_name, verify, THREAD);
*** 1114,1123 **** --- 1129,1146 ---- // Verification prevents us from creating names with dots in them, this // asserts that that's the case. assert(is_internal_format(parsed_name), "external class name format used internally"); + #if INCLUDE_JFR + { + InstanceKlass* ik = k(); + ON_KLASS_CREATION(ik, parser, THREAD); + k = instanceKlassHandle(ik); + } + #endif + // Add class just loaded // If a class loader supports parallel classloading handle parallel define requests // find_or_define_instance_class may return a different InstanceKlass if (is_parallelCapable(class_loader)) { k = find_or_define_instance_class(class_name, class_loader, k, THREAD);
*** 1374,1383 **** --- 1397,1415 ---- // Class is not found or has the wrong name, return NULL return nh; } } + static void post_class_define_event(InstanceKlass* k, const ClassLoaderData* def_cld) { + EventClassDefine event; + if (event.should_commit()) { + event.set_definedClass(k); + event.set_definingClassLoader(def_cld); + event.commit(); + } + } + void SystemDictionary::define_instance_class(instanceKlassHandle k, TRAPS) { ClassLoaderData* loader_data = k->class_loader_data(); Handle class_loader_h(THREAD, loader_data->class_loader());
*** 1444,1453 **** --- 1476,1486 ---- assert(THREAD->is_Java_thread(), "thread->is_Java_thread()"); JvmtiExport::post_class_load((JavaThread *) THREAD, k()); } + post_class_define_event(k(), loader_data); } // Support parallel classloading // All parallel class loaders, including bootstrap classloader // lock a placeholder entry for this class/class_loader pair
*** 2676,2705 **** // Verify constraint table guarantee(constraints() != NULL, "Verify of loader constraints failed"); constraints()->verify(dictionary(), placeholders()); } - // utility function for class load event - void SystemDictionary::post_class_load_event(const Ticks& start_time, - instanceKlassHandle k, - Handle initiating_loader) { - #if INCLUDE_TRACE - EventClassLoad event(UNTIMED); - if (event.should_commit()) { - event.set_starttime(start_time); - event.set_loadedClass(k()); - oop defining_class_loader = k->class_loader(); - event.set_definingClassLoader(defining_class_loader != NULL ? - defining_class_loader->klass() : (Klass*)NULL); - oop class_loader = initiating_loader.is_null() ? (oop)NULL : initiating_loader(); - event.set_initiatingClassLoader(class_loader != NULL ? - class_loader->klass() : (Klass*)NULL); - event.commit(); - } - #endif // INCLUDE_TRACE - } - #ifndef PRODUCT // statistics code class ClassStatistics: AllStatic { private: --- 2709,2718 ----
< prev index next >