@@ -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+
762782jobject 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
795798bool 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
830816void JfrJavaSupport::on_thread_start (Thread* t) {
0 commit comments