< prev index next >

src/hotspot/share/jfr/instrumentation/jfrEventClassTransformer.cpp

Print this page

1259   assert(signature != nullptr, "invariant");
1260   return nullptr != ik->find_local_method(name, signature, Klass::OverpassLookupMode::skip, Klass::StaticLookupMode::find,
1261                                           Klass::PrivateLookupMode::find);
1262 }
1263 
1264 // If for a subklass, on initial class load, an implementation exist for any of the final methods declared in Event,
1265 // then constraints are considered breached.
1266 static bool invalid_preconditions_for_subklass_on_initial_load(const InstanceKlass* ik) {
1267   assert(ik != nullptr, "invariant");
1268   return has_local_method_implementation(ik, begin, void_method_sig) ||
1269          has_local_method_implementation(ik, end, void_method_sig) ||
1270          has_local_method_implementation(ik, commit, void_method_sig) ||
1271          has_local_method_implementation(ik, isEnabled, boolean_method_sig) ||
1272          has_local_method_implementation(ik, shouldCommit, boolean_method_sig);
1273 }
1274 
1275 static ClassFileStream* schema_extend_event_subklass_bytes(const InstanceKlass* ik, const ClassFileParser& parser, bool& is_instrumented, TRAPS) {
1276   assert(JdkJfrEvent::is_a(ik), "invariant");
1277   assert(!is_instrumented, "invariant");
1278   DEBUG_ONLY(JfrJavaSupport::check_java_thread_in_vm(THREAD));

1279   if (invalid_preconditions_for_subklass_on_initial_load(ik)) {
1280     // Remove the tag denoting this as a jdk.jfr.Event subklass. No instrumentation, hence no events can be written.
1281     // The class is allowed to load as-is, but it is classified as outside of the jfr system.
1282     JdkJfrEvent::remove(ik);
1283     return nullptr;
1284   }
1285   jint size_of_new_bytes = 0;
1286   const u1* new_bytes = schema_extend_event_subklass_bytes(ik, parser, size_of_new_bytes, THREAD);
1287   if (new_bytes == nullptr) {
1288     return nullptr;
1289   }
1290   assert(new_bytes != nullptr, "invariant");
1291   assert(size_of_new_bytes > 0, "invariant");
1292   const bool force_instrumentation = should_force_instrumentation();
1293   if (Jfr::is_recording() || force_instrumentation) {
1294     jint size_of_instrumented_bytes = 0;
1295     unsigned char* instrumented_bytes = nullptr;
1296     const jclass super = static_cast<jclass>(JfrJavaSupport::local_jni_handle(ik->super()->java_mirror(), THREAD));
1297     const jboolean boot_class_loader = ik->class_loader_data()->is_boot_class_loader_data();
1298     JfrUpcalls::new_bytes_eager_instrumentation(JfrTraceId::load_raw(ik),

1259   assert(signature != nullptr, "invariant");
1260   return nullptr != ik->find_local_method(name, signature, Klass::OverpassLookupMode::skip, Klass::StaticLookupMode::find,
1261                                           Klass::PrivateLookupMode::find);
1262 }
1263 
1264 // If for a subklass, on initial class load, an implementation exist for any of the final methods declared in Event,
1265 // then constraints are considered breached.
1266 static bool invalid_preconditions_for_subklass_on_initial_load(const InstanceKlass* ik) {
1267   assert(ik != nullptr, "invariant");
1268   return has_local_method_implementation(ik, begin, void_method_sig) ||
1269          has_local_method_implementation(ik, end, void_method_sig) ||
1270          has_local_method_implementation(ik, commit, void_method_sig) ||
1271          has_local_method_implementation(ik, isEnabled, boolean_method_sig) ||
1272          has_local_method_implementation(ik, shouldCommit, boolean_method_sig);
1273 }
1274 
1275 static ClassFileStream* schema_extend_event_subklass_bytes(const InstanceKlass* ik, const ClassFileParser& parser, bool& is_instrumented, TRAPS) {
1276   assert(JdkJfrEvent::is_a(ik), "invariant");
1277   assert(!is_instrumented, "invariant");
1278   DEBUG_ONLY(JfrJavaSupport::check_java_thread_in_vm(THREAD));
1279   initialize_symbols();
1280   if (invalid_preconditions_for_subklass_on_initial_load(ik)) {
1281     // Remove the tag denoting this as a jdk.jfr.Event subklass. No instrumentation, hence no events can be written.
1282     // The class is allowed to load as-is, but it is classified as outside of the jfr system.
1283     JdkJfrEvent::remove(ik);
1284     return nullptr;
1285   }
1286   jint size_of_new_bytes = 0;
1287   const u1* new_bytes = schema_extend_event_subklass_bytes(ik, parser, size_of_new_bytes, THREAD);
1288   if (new_bytes == nullptr) {
1289     return nullptr;
1290   }
1291   assert(new_bytes != nullptr, "invariant");
1292   assert(size_of_new_bytes > 0, "invariant");
1293   const bool force_instrumentation = should_force_instrumentation();
1294   if (Jfr::is_recording() || force_instrumentation) {
1295     jint size_of_instrumented_bytes = 0;
1296     unsigned char* instrumented_bytes = nullptr;
1297     const jclass super = static_cast<jclass>(JfrJavaSupport::local_jni_handle(ik->super()->java_mirror(), THREAD));
1298     const jboolean boot_class_loader = ik->class_loader_data()->is_boot_class_loader_data();
1299     JfrUpcalls::new_bytes_eager_instrumentation(JfrTraceId::load_raw(ik),
< prev index next >