Skip to content

Commit d59db3b

Browse files
authored
[reflection] Add GC Unsafe transitions on embedding API functions (#52769)
Transition to GC Unsafe mode on every MONO_RT_EXTERNAL_ONLY function in reflection.c In particular, fix mono_reflection_type_from_name which is used in https://github.com/xamarin/xamarin-android/blob/681887ebdbd192ce7ce1cd02221d4939599ba762/src/monodroid/jni/embedded-assemblies.cc#L350 Fixes stack traces like ``` 05-14 08:06:12.848 31274 31274 F DEBUG : #00 pc 00000b99 [vdso] (__kernel_vsyscall+9) 05-14 08:06:12.848 31274 31274 F DEBUG : #1 pc 0005ad68 /apex/com.android.runtime/lib/bionic/libc.so (syscall+40) (BuildId: 6e3a0180fa6637b68c0d181c343e6806) 05-14 08:06:12.848 31274 31274 F DEBUG : #2 pc 00076511 /apex/com.android.runtime/lib/bionic/libc.so (abort+209) (BuildId: 6e3a0180fa6637b68c0d181c343e6806) 05-14 08:06:12.848 31274 31274 F DEBUG : #3 pc 0002afcd /data/app/~~rMrkpKmVPaBpM5jKb8fPAg==/com.microsoft.maui-JfRo8RWSDJaNtJuBa0y7_Q==/lib/x86/libmonodroid.so (xamarin::android::internal::MonodroidRuntime::mono_log_handler(char const*, char const*, char const*, int, void*)+141) (BuildId: 9726f32ad5f8fa5e7c5762baf2f6e3294da41cc1) 05-14 08:06:12.848 31274 31274 F DEBUG : #4 pc 00112c5d /data/app/~~rMrkpKmVPaBpM5jKb8fPAg==/com.microsoft.maui-JfRo8RWSDJaNtJuBa0y7_Q==/lib/x86/libmonosgen-2.0.so (eglib_log_adapter+141) (BuildId: b67e93dd750dafdd6f65f408b021b6a3a74868ac) 05-14 08:06:12.849 31274 31274 F DEBUG : #5 pc 00020fdf /data/app/~~rMrkpKmVPaBpM5jKb8fPAg==/com.microsoft.maui-JfRo8RWSDJaNtJuBa0y7_Q==/lib/x86/libmonosgen-2.0.so (monoeg_g_logv+175) (BuildId: b67e93dd750dafdd6f65f408b021b6a3a74868ac) 05-14 08:06:12.849 31274 31274 F DEBUG : #6 pc 0002113a /data/app/~~rMrkpKmVPaBpM5jKb8fPAg==/com.microsoft.maui-JfRo8RWSDJaNtJuBa0y7_Q==/lib/x86/libmonosgen-2.0.so (monoeg_g_log+42) (BuildId: b67e93dd750dafdd6f65f408b021b6a3a74868ac) 05-14 08:06:12.849 31274 31274 F DEBUG : #7 pc 00128892 /data/app/~~rMrkpKmVPaBpM5jKb8fPAg==/com.microsoft.maui-JfRo8RWSDJaNtJuBa0y7_Q==/lib/x86/libmonosgen-2.0.so (mono_threads_transition_do_blocking+258) (BuildId: b67e93dd750dafdd6f65f408b021b6a3a74868ac) 05-14 08:06:12.849 31274 31274 F DEBUG : #8 pc 0012a406 /data/app/~~rMrkpKmVPaBpM5jKb8fPAg==/com.microsoft.maui-JfRo8RWSDJaNtJuBa0y7_Q==/lib/x86/libmonosgen-2.0.so (mono_threads_enter_gc_safe_region_unbalanced_with_info+134) (BuildId: b67e93dd750dafdd6f65f408b021b6a3a74868ac) 05-14 08:06:12.849 31274 31274 F DEBUG : #9 pc 0012a27e /data/app/~~rMrkpKmVPaBpM5jKb8fPAg==/com.microsoft.maui-JfRo8RWSDJaNtJuBa0y7_Q==/lib/x86/libmonosgen-2.0.so (mono_threads_enter_gc_safe_region_internal+46) (BuildId: b67e93dd750dafdd6f65f408b021b6a3a74868ac) 05-14 08:06:12.849 31274 31274 F DEBUG : #10 pc 000799a7 /data/app/~~rMrkpKmVPaBpM5jKb8fPAg==/com.microsoft.maui-JfRo8RWSDJaNtJuBa0y7_Q==/lib/x86/libmonosgen-2.0.so (mono_loader_lock+71) (BuildId: b67e93dd750dafdd6f65f408b021b6a3a74868ac) 05-14 08:06:12.849 31274 31274 F DEBUG : #11 pc 000447a1 /data/app/~~rMrkpKmVPaBpM5jKb8fPAg==/com.microsoft.maui-JfRo8RWSDJaNtJuBa0y7_Q==/lib/x86/libmonosgen-2.0.so (mono_class_create_from_typedef+129) (BuildId: b67e93dd750dafdd6f65f408b021b6a3a74868ac) 05-14 08:06:12.849 31274 31274 F DEBUG : #12 pc 0003c073 /data/app/~~rMrkpKmVPaBpM5jKb8fPAg==/com.microsoft.maui-JfRo8RWSDJaNtJuBa0y7_Q==/lib/x86/libmonosgen-2.0.so (mono_class_get_checked+99) (BuildId: b67e93dd750dafdd6f65f408b021b6a3a74868ac) 05-14 08:06:12.849 31274 31274 F DEBUG : #13 pc 0003cc0f /data/app/~~rMrkpKmVPaBpM5jKb8fPAg==/com.microsoft.maui-JfRo8RWSDJaNtJuBa0y7_Q==/lib/x86/libmonosgen-2.0.so (mono_class_from_name_checked_aux+735) (BuildId: b67e93dd750dafdd6f65f408b021b6a3a74868ac) 05-14 08:06:12.849 31274 31274 F DEBUG : #14 pc 00037989 /data/app/~~rMrkpKmVPaBpM5jKb8fPAg==/com.microsoft.maui-JfRo8RWSDJaNtJuBa0y7_Q==/lib/x86/libmonosgen-2.0.so (mono_class_from_name_checked+73) (BuildId: b67e93dd750dafdd6f65f408b021b6a3a74868ac) 05-14 08:06:12.849 31274 31274 F DEBUG : #15 pc 000cc5f4 /data/app/~~rMrkpKmVPaBpM5jKb8fPAg==/com.microsoft.maui-JfRo8RWSDJaNtJuBa0y7_Q==/lib/x86/libmonosgen-2.0.so (mono_reflection_get_type_internal+132) (BuildId: b67e93dd750dafdd6f65f408b021b6a3a74868ac) 05-14 08:06:12.849 31274 31274 F DEBUG : #16 pc 000c9bce /data/app/~~rMrkpKmVPaBpM5jKb8fPAg==/com.microsoft.maui-JfRo8RWSDJaNtJuBa0y7_Q==/lib/x86/libmonosgen-2.0.so (mono_reflection_get_type_with_rootimage+126) (BuildId: b67e93dd750dafdd6f65f408b021b6a3a74868ac) 05-14 08:06:12.849 31274 31274 F DEBUG : #17 pc 000ca204 /data/app/~~rMrkpKmVPaBpM5jKb8fPAg==/com.microsoft.maui-JfRo8RWSDJaNtJuBa0y7_Q==/lib/x86/libmonosgen-2.0.so (_mono_reflection_get_type_from_info+292) (BuildId: b67e93dd750dafdd6f65f408b021b6a3a74868ac) 05-14 08:06:12.849 31274 31274 F DEBUG : #18 pc 000ca06e /data/app/~~rMrkpKmVPaBpM5jKb8fPAg==/com.microsoft.maui-JfRo8RWSDJaNtJuBa0y7_Q==/lib/x86/libmonosgen-2.0.so (mono_reflection_type_from_name_checked+334) (BuildId: b67e93dd750dafdd6f65f408b021b6a3a74868ac) 05-14 08:06:12.849 31274 31274 F DEBUG : #19 pc 000c9f01 /data/app/~~rMrkpKmVPaBpM5jKb8fPAg==/com.microsoft.maui-JfRo8RWSDJaNtJuBa0y7_Q==/lib/x86/libmonosgen-2.0.so (mono_reflection_type_from_name+49) (BuildId: b67e93dd750dafdd6f65f408b021b6a3a74868ac) 05-14 08:06:12.849 31274 31274 F DEBUG : #20 pc 0001b40b /data/app/~~rMrkpKmVPaBpM5jKb8fPAg==/com.microsoft.maui-JfRo8RWSDJaNtJuBa0y7_Q==/lib/x86/libmonodroid.so (xamarin::android::internal::EmbeddedAssemblies::typemap_java_to_managed(char const*)+427) (BuildId: 9726f32ad5f8fa5e7c5762baf2f6e3294da41cc1) 05-14 08:06:12.849 31274 31274 F DEBUG : #21 pc 0001b551 /data/app/~~rMrkpKmVPaBpM5jKb8fPAg==/com.microsoft.maui-JfRo8RWSDJaNtJuBa0y7_Q==/lib/x86/libmonodroid.so (xamarin::android::internal::EmbeddedAssemblies::typemap_java_to_managed(_MonoString*)+113) (BuildId: 9726f32ad5f8fa5e7c5762baf2f6e3294da41cc1) 05-14 08:06:12.849 31274 31274 F DEBUG : #22 pc 000211a7 /data/app/~~rMrkpKmVPaBpM5jKb8fPAg==/com.microsoft.maui-JfRo8RWSDJaNtJuBa0y7_Q==/lib/x86/libmonodroid.so (xamarin::android::internal::MonodroidRuntime::typemap_java_to_managed(_MonoString*)+39) (BuildId: 9726f32ad5f8fa5e7c5762baf2f6e3294da41cc1) ```
1 parent 0d6fcd5 commit d59db3b

File tree

1 file changed

+45
-11
lines changed

1 file changed

+45
-11
lines changed

src/mono/mono/metadata/reflection.c

Lines changed: 45 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -242,10 +242,13 @@ mono_assembly_get_object_handle (MonoAssembly *assembly, MonoError *error)
242242
MonoReflectionModule*
243243
mono_module_get_object (MonoDomain *domain, MonoImage *image)
244244
{
245+
MonoReflectionModuleHandle result;
245246
HANDLE_FUNCTION_ENTER ();
247+
MONO_ENTER_GC_UNSAFE;
246248
ERROR_DECL (error);
247-
MonoReflectionModuleHandle result = mono_module_get_object_handle (image, error);
249+
result = mono_module_get_object_handle (image, error);
248250
mono_error_cleanup (error);
251+
MONO_EXIT_GC_UNSAFE;
249252
HANDLE_FUNCTION_RETURN_OBJ (result);
250253
}
251254

@@ -308,10 +311,13 @@ mono_module_get_object_handle (MonoImage *image, MonoError *error)
308311
MonoReflectionModule*
309312
mono_module_file_get_object (MonoDomain *domain, MonoImage *image, int table_index)
310313
{
314+
MonoReflectionModuleHandle result;
311315
HANDLE_FUNCTION_ENTER ();
316+
MONO_ENTER_GC_UNSAFE;
312317
ERROR_DECL (error);
313-
MonoReflectionModuleHandle result = mono_module_file_get_object_handle (image, table_index, error);
318+
result = mono_module_file_get_object_handle (image, table_index, error);
314319
mono_error_cleanup (error);
320+
MONO_EXIT_GC_UNSAFE;
315321
HANDLE_FUNCTION_RETURN_OBJ (result);
316322
}
317323

@@ -692,10 +698,13 @@ mono_method_clear_object (MonoMethod *method)
692698
MonoReflectionField*
693699
mono_field_get_object (MonoDomain *domain, MonoClass *klass, MonoClassField *field)
694700
{
701+
MonoReflectionFieldHandle result;
695702
HANDLE_FUNCTION_ENTER ();
703+
MONO_ENTER_GC_UNSAFE;
696704
ERROR_DECL (error);
697-
MonoReflectionFieldHandle result = mono_field_get_object_handle (klass, field, error);
705+
result = mono_field_get_object_handle (klass, field, error);
698706
mono_error_cleanup (error);
707+
MONO_EXIT_GC_UNSAFE;
699708
HANDLE_FUNCTION_RETURN_OBJ (result);
700709
}
701710

@@ -770,10 +779,13 @@ mono_field_get_object_checked (MonoClass *klass, MonoClassField *field, MonoErro
770779
MonoReflectionProperty*
771780
mono_property_get_object (MonoDomain *domain, MonoClass *klass, MonoProperty *property)
772781
{
782+
MonoReflectionPropertyHandle result;
773783
HANDLE_FUNCTION_ENTER ();
784+
MONO_ENTER_GC_UNSAFE;
774785
ERROR_DECL (error);
775-
MonoReflectionPropertyHandle result = mono_property_get_object_handle (klass, property, error);
786+
result = mono_property_get_object_handle (klass, property, error);
776787
mono_error_cleanup (error);
788+
MONO_EXIT_GC_UNSAFE;
777789
HANDLE_FUNCTION_RETURN_OBJ (result);
778790
}
779791

@@ -834,10 +846,13 @@ mono_property_get_object_checked (MonoClass *klass, MonoProperty *property, Mono
834846
MonoReflectionEvent*
835847
mono_event_get_object (MonoDomain *domain, MonoClass *klass, MonoEvent *event)
836848
{
849+
MonoReflectionEventHandle result;
837850
HANDLE_FUNCTION_ENTER ();
851+
MONO_ENTER_GC_UNSAFE;
838852
ERROR_DECL (error);
839-
MonoReflectionEventHandle result = mono_event_get_object_handle (klass, event, error);
853+
result = mono_event_get_object_handle (klass, event, error);
840854
mono_error_cleanup (error);
855+
MONO_EXIT_GC_UNSAFE;
841856
HANDLE_FUNCTION_RETURN_OBJ (result);
842857
}
843858

@@ -1134,10 +1149,13 @@ mono_param_get_objects_internal (MonoMethod *method, MonoClass *refclass, MonoEr
11341149
MonoArray*
11351150
mono_param_get_objects (MonoDomain *domain, MonoMethod *method)
11361151
{
1152+
MonoArrayHandle result;
11371153
HANDLE_FUNCTION_ENTER ();
1154+
MONO_ENTER_GC_UNSAFE;
11381155
ERROR_DECL (error);
1139-
MonoArrayHandle result = mono_param_get_objects_internal (method, NULL, error);
1156+
result = mono_param_get_objects_internal (method, NULL, error);
11401157
mono_error_assert_ok (error);
1158+
MONO_EXIT_GC_UNSAFE;
11411159
HANDLE_FUNCTION_RETURN_OBJ (result);
11421160
}
11431161

@@ -1202,10 +1220,13 @@ add_exception_handling_clause_to_array (MonoMethodHeader *header, int idx, MonoA
12021220
MonoReflectionMethodBody*
12031221
mono_method_body_get_object (MonoDomain *domain, MonoMethod *method)
12041222
{
1223+
MonoReflectionMethodBodyHandle result;
12051224
HANDLE_FUNCTION_ENTER ();
1225+
MONO_ENTER_GC_UNSAFE;
12061226
ERROR_DECL (error);
1207-
MonoReflectionMethodBodyHandle result = mono_method_body_get_object_handle (method, error);
1227+
result = mono_method_body_get_object_handle (method, error);
12081228
mono_error_cleanup (error);
1229+
MONO_EXIT_GC_UNSAFE;
12091230
HANDLE_FUNCTION_RETURN_OBJ (result);
12101231
}
12111232

@@ -1902,9 +1923,12 @@ mono_identifier_unescape_info (MonoTypeNameParse *info)
19021923
int
19031924
mono_reflection_parse_type (char *name, MonoTypeNameParse *info)
19041925
{
1926+
gboolean result;
1927+
MONO_ENTER_GC_UNSAFE;
19051928
ERROR_DECL (error);
1906-
gboolean result = mono_reflection_parse_type_checked (name, info, error);
1929+
result = mono_reflection_parse_type_checked (name, info, error);
19071930
mono_error_cleanup (error);
1931+
MONO_EXIT_GC_UNSAFE;
19081932
return result ? 1 : 0;
19091933
}
19101934

@@ -2133,9 +2157,12 @@ mono_reflection_get_type_internal (MonoAssemblyLoadContext *alc, MonoImage *root
21332157
MonoType*
21342158
mono_reflection_get_type (MonoImage* image, MonoTypeNameParse *info, gboolean ignorecase, gboolean *type_resolve)
21352159
{
2160+
MonoType *result;
2161+
MONO_ENTER_GC_UNSAFE;
21362162
ERROR_DECL (error);
2137-
MonoType *result = mono_reflection_get_type_with_rootimage (mono_alc_get_default (), image, image, info, ignorecase, TRUE, type_resolve, error);
2163+
result = mono_reflection_get_type_with_rootimage (mono_alc_get_default (), image, image, info, ignorecase, TRUE, type_resolve, error);
21382164
mono_error_cleanup (error);
2165+
MONO_EXIT_GC_UNSAFE;
21392166
return result;
21402167
}
21412168

@@ -2333,13 +2360,16 @@ mono_reflection_free_type_info (MonoTypeNameParse *info)
23332360
MonoType*
23342361
mono_reflection_type_from_name (char *name, MonoImage *image)
23352362
{
2363+
MonoType *result;
2364+
MONO_ENTER_GC_UNSAFE;
23362365
ERROR_DECL (error);
23372366

23382367
MonoAssemblyLoadContext *alc = mono_alc_get_default ();
23392368

2340-
MonoType * const result = mono_reflection_type_from_name_checked (name, alc, image, error);
2369+
result = mono_reflection_type_from_name_checked (name, alc, image, error);
23412370

23422371
mono_error_cleanup (error);
2372+
MONO_EXIT_GC_UNSAFE;
23432373
return result;
23442374
}
23452375

@@ -2385,11 +2415,15 @@ mono_reflection_type_from_name_checked (char *name, MonoAssemblyLoadContext *alc
23852415
guint32
23862416
mono_reflection_get_token (MonoObject *obj_raw)
23872417
{
2418+
guint32 result;
23882419
HANDLE_FUNCTION_ENTER ();
2420+
MONO_ENTER_GC_UNSAFE;
23892421
MONO_HANDLE_DCL (MonoObject, obj);
23902422
ERROR_DECL (error);
2391-
guint32 result = mono_reflection_get_token_checked (obj, error);
2423+
result = mono_reflection_get_token_checked (obj, error);
23922424
mono_error_assert_ok (error);
2425+
2426+
MONO_EXIT_GC_UNSAFE;
23932427
HANDLE_FUNCTION_RETURN_VAL (result);
23942428
}
23952429

0 commit comments

Comments
 (0)