src/share/vm/classfile/systemDictionary.cpp

changeset 9858
b985cbb00e68
parent 9550
270570f695e0
child 9866
41515291559a
     1.1 --- a/src/share/vm/classfile/systemDictionary.cpp	Thu Aug 01 03:44:03 2019 +0100
     1.2 +++ b/src/share/vm/classfile/systemDictionary.cpp	Mon Aug 12 18:30:40 2019 +0300
     1.3 @@ -38,6 +38,7 @@
     1.4  #include "compiler/compileBroker.hpp"
     1.5  #include "interpreter/bytecodeStream.hpp"
     1.6  #include "interpreter/interpreter.hpp"
     1.7 +#include "jfr/jfrEvents.hpp"
     1.8  #include "memory/filemap.hpp"
     1.9  #include "memory/gcLocker.hpp"
    1.10  #include "memory/oopFactory.hpp"
    1.11 @@ -64,9 +65,6 @@
    1.12  #include "services/threadService.hpp"
    1.13  #include "utilities/macros.hpp"
    1.14  #include "utilities/ticks.hpp"
    1.15 -#if INCLUDE_TRACE
    1.16 -#include "trace/tracing.hpp"
    1.17 -#endif
    1.18  
    1.19  Dictionary*            SystemDictionary::_dictionary          = NULL;
    1.20  PlaceholderTable*      SystemDictionary::_placeholders        = NULL;
    1.21 @@ -598,6 +596,22 @@
    1.22    return (nh);
    1.23  }
    1.24  
    1.25 +// utility function for class load event
    1.26 +static void post_class_load_event(EventClassLoad &event,
    1.27 +                                  instanceKlassHandle k,
    1.28 +                                  Handle initiating_loader) {
    1.29 +#if INCLUDE_JFR
    1.30 +  if (event.should_commit()) {
    1.31 +    event.set_loadedClass(k());
    1.32 +    event.set_definingClassLoader(k->class_loader_data());
    1.33 +    oop class_loader = initiating_loader.is_null() ? (oop)NULL : initiating_loader();
    1.34 +    event.set_initiatingClassLoader(class_loader != NULL ?
    1.35 +                                    ClassLoaderData::class_loader_data_or_null(class_loader) :
    1.36 +                                    (ClassLoaderData*)NULL);
    1.37 +    event.commit();
    1.38 +  }
    1.39 +#endif // INCLUDE_JFR
    1.40 +}
    1.41  
    1.42  Klass* SystemDictionary::resolve_instance_class_or_null(Symbol* name,
    1.43                                                          Handle class_loader,
    1.44 @@ -606,7 +620,7 @@
    1.45    assert(name != NULL && !FieldType::is_array(name) &&
    1.46           !FieldType::is_obj(name), "invalid class name");
    1.47  
    1.48 -  Ticks class_load_start_time = Ticks::now();
    1.49 +  EventClassLoad class_load_start_event;
    1.50  
    1.51    // UseNewReflection
    1.52    // Fix for 4474172; see evaluation for more details
    1.53 @@ -857,7 +871,7 @@
    1.54      return NULL;
    1.55    }
    1.56  
    1.57 -  post_class_load_event(class_load_start_time, k, class_loader);
    1.58 +  post_class_load_event(class_load_start_event, k, class_loader);
    1.59  
    1.60  #ifdef ASSERT
    1.61    {
    1.62 @@ -982,7 +996,7 @@
    1.63                                        TRAPS) {
    1.64    TempNewSymbol parsed_name = NULL;
    1.65  
    1.66 -  Ticks class_load_start_time = Ticks::now();
    1.67 +  EventClassLoad class_load_start_event;
    1.68  
    1.69    ClassLoaderData* loader_data;
    1.70    if (host_klass.not_null()) {
    1.71 @@ -1043,7 +1057,7 @@
    1.72          JvmtiExport::post_class_load((JavaThread *) THREAD, k());
    1.73      }
    1.74  
    1.75 -    post_class_load_event(class_load_start_time, k, class_loader);
    1.76 +    post_class_load_event(class_load_start_event, k, class_loader);
    1.77    }
    1.78    assert(host_klass.not_null() || cp_patches == NULL,
    1.79           "cp_patches only found with host_klass");
    1.80 @@ -1085,12 +1099,13 @@
    1.81    //
    1.82    // Note: "name" is updated.
    1.83  
    1.84 -  instanceKlassHandle k = ClassFileParser(st).parseClassFile(class_name,
    1.85 -                                                             loader_data,
    1.86 -                                                             protection_domain,
    1.87 -                                                             parsed_name,
    1.88 -                                                             verify,
    1.89 -                                                             THREAD);
    1.90 +  ClassFileParser parser(st);
    1.91 +  instanceKlassHandle k = parser.parseClassFile(class_name,
    1.92 +                                                loader_data,
    1.93 +                                                protection_domain,
    1.94 +                                                parsed_name,
    1.95 +                                                verify,
    1.96 +                                                THREAD);
    1.97  
    1.98    const char* pkg = "java/";
    1.99    size_t pkglen = strlen(pkg);
   1.100 @@ -1125,6 +1140,14 @@
   1.101      assert(is_internal_format(parsed_name),
   1.102             "external class name format used internally");
   1.103  
   1.104 +#if INCLUDE_JFR
   1.105 +    {
   1.106 +      InstanceKlass* ik = k();
   1.107 +      ON_KLASS_CREATION(ik, parser, THREAD);
   1.108 +      k = instanceKlassHandle(ik);
   1.109 +    }
   1.110 +#endif
   1.111 +
   1.112      // Add class just loaded
   1.113      // If a class loader supports parallel classloading handle parallel define requests
   1.114      // find_or_define_instance_class may return a different InstanceKlass
   1.115 @@ -1385,6 +1408,15 @@
   1.116    }
   1.117  }
   1.118  
   1.119 +static void post_class_define_event(InstanceKlass* k, const ClassLoaderData* def_cld) {
   1.120 +  EventClassDefine event;
   1.121 +  if (event.should_commit()) {
   1.122 +    event.set_definedClass(k);
   1.123 +    event.set_definingClassLoader(def_cld);
   1.124 +    event.commit();
   1.125 +  }
   1.126 +}
   1.127 +
   1.128  void SystemDictionary::define_instance_class(instanceKlassHandle k, TRAPS) {
   1.129  
   1.130    ClassLoaderData* loader_data = k->class_loader_data();
   1.131 @@ -1455,6 +1487,7 @@
   1.132  
   1.133    }
   1.134  
   1.135 +  post_class_define_event(k(), loader_data);
   1.136  }
   1.137  
   1.138  // Support parallel classloading
   1.139 @@ -2687,26 +2720,6 @@
   1.140    constraints()->verify(dictionary(), placeholders());
   1.141  }
   1.142  
   1.143 -// utility function for class load event
   1.144 -void SystemDictionary::post_class_load_event(const Ticks& start_time,
   1.145 -                                             instanceKlassHandle k,
   1.146 -                                             Handle initiating_loader) {
   1.147 -#if INCLUDE_TRACE
   1.148 -  EventClassLoad event(UNTIMED);
   1.149 -  if (event.should_commit()) {
   1.150 -    event.set_starttime(start_time);
   1.151 -    event.set_loadedClass(k());
   1.152 -    oop defining_class_loader = k->class_loader();
   1.153 -    event.set_definingClassLoader(defining_class_loader !=  NULL ?
   1.154 -                                    defining_class_loader->klass() : (Klass*)NULL);
   1.155 -    oop class_loader = initiating_loader.is_null() ? (oop)NULL : initiating_loader();
   1.156 -    event.set_initiatingClassLoader(class_loader != NULL ?
   1.157 -                                      class_loader->klass() : (Klass*)NULL);
   1.158 -    event.commit();
   1.159 -  }
   1.160 -#endif // INCLUDE_TRACE
   1.161 -}
   1.162 -
   1.163  #ifndef PRODUCT
   1.164  
   1.165  // statistics code

mercurial