< 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 >