Skip to content

Commit a187fcc

Browse files
author
Markus Grönlund
committedJun 10, 2021
8238197: JFR: Rework setting and getting EventHandler
Reviewed-by: egahlin, jbachorik
1 parent f770f77 commit a187fcc

File tree

2 files changed

+48
-68
lines changed

2 files changed

+48
-68
lines changed
 

‎src/hotspot/share/jfr/jni/jfrJavaSupport.cpp

+42-56
Original file line numberDiff line numberDiff line change
@@ -759,72 +759,58 @@ bool JfrJavaSupport::is_excluded(jobject thread) {
759759
return native_thread != NULL ? native_thread->jfr_thread_local()->is_excluded() : is_thread_excluded(thread);
760760
}
761761

762+
static const Klass* get_handler_field_descriptor(const Handle& h_mirror, fieldDescriptor* descriptor, TRAPS) {
763+
assert(h_mirror.not_null(), "invariant");
764+
assert(descriptor != NULL, "invariant");
765+
Klass* const k = java_lang_Class::as_Klass(h_mirror());
766+
assert(k->is_instance_klass(), "invariant");
767+
InstanceKlass* const ik = InstanceKlass::cast(k);
768+
if (ik->is_not_initialized()) {
769+
ik->initialize(CHECK_NULL);
770+
}
771+
assert(ik->is_being_initialized() || ik->is_initialized(), "invariant");
772+
const Klass* const typed_field_holder = ik->find_field(vmSymbols::eventHandler_name(),
773+
vmSymbols::jdk_jfr_internal_handlers_EventHandler_signature(),
774+
true,
775+
descriptor);
776+
return typed_field_holder != NULL ? typed_field_holder : ik->find_field(vmSymbols::eventHandler_name(),
777+
vmSymbols::object_signature(), // untyped
778+
true,
779+
descriptor);
780+
}
781+
762782
jobject JfrJavaSupport::get_handler(jobject clazz, TRAPS) {
763783
DEBUG_ONLY(JfrJavaSupport::check_java_thread_in_vm(THREAD));
764-
const oop klass_oop = JNIHandles::resolve(clazz);
765-
assert(klass_oop != NULL, "invariant");
766-
Klass* klass = java_lang_Class::as_Klass(klass_oop);
767784
HandleMark hm(THREAD);
768-
Handle h_klass_oop(Handle(THREAD, klass->java_mirror()));
769-
InstanceKlass* const instance_klass = static_cast<InstanceKlass*>(klass);
770-
klass->initialize(CHECK_NULL);
771-
772-
fieldDescriptor event_handler_field;
773-
Klass* f = instance_klass->find_field(
774-
vmSymbols::eventHandler_name(),
775-
vmSymbols::jdk_jfr_internal_handlers_EventHandler_signature(),
776-
true, &event_handler_field);
777-
if (f != NULL) {
778-
oop ret = h_klass_oop->obj_field(event_handler_field.offset());
779-
return ret != NULL ? JfrJavaSupport::local_jni_handle(ret, THREAD) : NULL;
785+
const Handle h_mirror(Handle(THREAD, JNIHandles::resolve(clazz)));
786+
assert(h_mirror.not_null(), "invariant");
787+
fieldDescriptor handler_field_descriptor;
788+
const Klass* const field_holder = get_handler_field_descriptor(h_mirror, &handler_field_descriptor, THREAD);
789+
if (field_holder == NULL) {
790+
// The only reason should be that klass initialization failed.
791+
return NULL;
780792
}
781-
782-
fieldDescriptor object_field;
783-
Klass* g = instance_klass->find_field(
784-
vmSymbols::eventHandler_name(),
785-
vmSymbols::object_signature(),
786-
true, &object_field);
787-
if (g != NULL) {
788-
oop ret = h_klass_oop->obj_field(object_field.offset());
789-
return ret != NULL ? JfrJavaSupport::local_jni_handle(ret, THREAD) : NULL;
790-
}
791-
assert(f == NULL && g == NULL, "no handler field for class");
792-
return NULL;
793+
assert(java_lang_Class::as_Klass(h_mirror()) == field_holder, "invariant");
794+
oop handler_oop = h_mirror->obj_field(handler_field_descriptor.offset());
795+
return handler_oop != NULL ? JfrJavaSupport::local_jni_handle(handler_oop, THREAD) : NULL;
793796
}
794797

795798
bool JfrJavaSupport::set_handler(jobject clazz, jobject handler, TRAPS) {
796799
DEBUG_ONLY(JfrJavaSupport::check_java_thread_in_vm(THREAD));
797-
const oop klass_oop = JNIHandles::resolve(clazz);
798-
assert(klass_oop != NULL, "invariant");
799-
const oop handler_oop = JNIHandles::resolve(handler);
800-
assert(handler_oop != NULL, "invariant");
801-
Klass* klass = java_lang_Class::as_Klass(klass_oop);
802800
HandleMark hm(THREAD);
803-
Handle h_klass_oop(Handle(THREAD, klass->java_mirror()));
804-
InstanceKlass* const instance_klass = static_cast<InstanceKlass*>(klass);
805-
klass->initialize(CHECK_false);
806-
807-
fieldDescriptor event_handler_field;
808-
Klass* f = instance_klass->find_field(
809-
vmSymbols::eventHandler_name(),
810-
vmSymbols::jdk_jfr_internal_handlers_EventHandler_signature(),
811-
true, &event_handler_field);
812-
if (f != NULL) {
813-
h_klass_oop->obj_field_put(event_handler_field.offset(), handler_oop);
814-
return true;
815-
}
816-
817-
fieldDescriptor object_handler_field;
818-
Klass* g = instance_klass->find_field(
819-
vmSymbols::eventHandler_name(),
820-
vmSymbols::object_signature(),
821-
true, &object_handler_field);
822-
if (g != NULL) {
823-
h_klass_oop->obj_field_put(object_handler_field.offset(), handler_oop);
824-
return true;
801+
const Handle h_mirror(Handle(THREAD, JNIHandles::resolve(clazz)));
802+
assert(h_mirror.not_null(), "invariant");
803+
fieldDescriptor handler_field_descriptor;
804+
const Klass* const field_holder = get_handler_field_descriptor(h_mirror, &handler_field_descriptor, THREAD);
805+
if (field_holder == NULL) {
806+
// The only reason should be that klass initialization failed.
807+
return false;
825808
}
826-
assert(f == NULL && g == NULL, "no handler field for class");
827-
return false;
809+
assert(java_lang_Class::as_Klass(h_mirror()) == field_holder, "invariant");
810+
const oop handler_oop = JNIHandles::resolve(handler);
811+
assert(handler_oop != NULL, "invariant");
812+
h_mirror->obj_field_put(handler_field_descriptor.offset(), handler_oop);
813+
return true;
828814
}
829815

830816
void JfrJavaSupport::on_thread_start(Thread* t) {

‎src/jdk.jfr/share/classes/jdk/jfr/internal/Utils.java

+6-12
Original file line numberDiff line numberDiff line change
@@ -445,23 +445,17 @@ static long nanosToTicks(long nanos) {
445445

446446
public static synchronized EventHandler getHandler(Class<? extends jdk.internal.event.Event> eventClass) {
447447
Utils.ensureValidEventSubclass(eventClass);
448-
try {
449-
Field f = eventClass.getDeclaredField(EventInstrumentation.FIELD_EVENT_HANDLER);
450-
SecuritySupport.setAccessible(f);
451-
return (EventHandler) f.get(null);
452-
} catch (NoSuchFieldException | IllegalArgumentException | IllegalAccessException e) {
453-
throw new InternalError("Could not access event handler");
448+
Object handler = JVM.getJVM().getHandler(eventClass);
449+
if (handler == null || handler instanceof EventHandler) {
450+
return (EventHandler) handler;
454451
}
452+
throw new InternalError("Could not access event handler");
455453
}
456454

457455
static synchronized void setHandler(Class<? extends jdk.internal.event.Event> eventClass, EventHandler handler) {
458456
Utils.ensureValidEventSubclass(eventClass);
459-
try {
460-
Field field = eventClass.getDeclaredField(EventInstrumentation.FIELD_EVENT_HANDLER);
461-
SecuritySupport.setAccessible(field);
462-
field.set(null, handler);
463-
} catch (NoSuchFieldException | IllegalArgumentException | IllegalAccessException e) {
464-
throw new InternalError("Could not access event handler");
457+
if (!JVM.getJVM().setHandler(eventClass, handler)) {
458+
throw new InternalError("Could not set event handler");
465459
}
466460
}
467461

1 commit comments

Comments
 (1)

openjdk-notifier[bot] commented on Jun 10, 2021

@openjdk-notifier[bot]
Please sign in to comment.