@@ -759,72 +759,58 @@ bool JfrJavaSupport::is_excluded(jobject thread) {
759
759
return native_thread != NULL ? native_thread->jfr_thread_local ()->is_excluded () : is_thread_excluded (thread);
760
760
}
761
761
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
+
762
782
jobject JfrJavaSupport::get_handler (jobject clazz, TRAPS) {
763
783
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);
767
784
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 ;
780
792
}
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 ;
793
796
}
794
797
795
798
bool JfrJavaSupport::set_handler (jobject clazz, jobject handler, TRAPS) {
796
799
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);
802
800
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 ;
825
808
}
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 ;
828
814
}
829
815
830
816
void JfrJavaSupport::on_thread_start (Thread* t) {
1 commit comments
openjdk-notifier[bot] commentedon Jun 10, 2021
Review
Issues