diff options
author | monojenkins <jo.shields+jenkins@xamarin.com> | 2020-03-20 06:57:43 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-03-20 06:57:43 +0300 |
commit | f0784b26ddbc745416c91c34ca0564b7ae3b5869 (patch) | |
tree | 530cc5716622a9f739022e7e954321227b104d8d | |
parent | d90665a422e9f8d015585b3ca381d74faa033cc4 (diff) |
[mono] Enter GC Unsafe mode in some string allocation functions (#19262)
All these functions are MONO_RT_EXTERNAL_ONLY and they all allocate managed
objects.
Fixes a deadlock if an embedder calls the function and it needs to take the GC
lock to do a collection.
Co-authored-by: lambdageek <lambdageek@users.noreply.github.com>
-rw-r--r-- | mono/metadata/object.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/mono/metadata/object.c b/mono/metadata/object.c index f6946d178f1..a69ff1083a9 100644 --- a/mono/metadata/object.c +++ b/mono/metadata/object.c @@ -6624,13 +6624,12 @@ mono_string_empty_handle (MonoDomain *domain) MonoString * mono_string_new_utf16 (MonoDomain *domain, const mono_unichar2 *text, gint32 len) { - MONO_REQ_GC_UNSAFE_MODE; - - ERROR_DECL (error); MonoString *res = NULL; + MONO_ENTER_GC_UNSAFE; + ERROR_DECL (error); res = mono_string_new_utf16_checked (domain, text, len, error); mono_error_cleanup (error); - + MONO_EXIT_GC_UNSAFE; return res; } @@ -6727,10 +6726,12 @@ mono_string_new_utf32 (MonoDomain *domain, const mono_unichar4 *text, gint32 len MonoString * mono_string_new_size (MonoDomain *domain, gint32 len) { + MonoString *str; + MONO_ENTER_GC_UNSAFE; ERROR_DECL (error); - MonoString *str = mono_string_new_size_checked (domain, len, error); + str = mono_string_new_size_checked (domain, len, error); mono_error_cleanup (error); - + MONO_EXIT_GC_UNSAFE; return str; } @@ -7563,9 +7564,12 @@ mono_string_intern (MonoString *str_raw) MonoString* mono_ldstr (MonoDomain *domain, MonoImage *image, guint32 idx) { + MonoString *result; + MONO_ENTER_GC_UNSAFE; ERROR_DECL (error); - MonoString *result = mono_ldstr_checked (domain, image, idx, error); + result = mono_ldstr_checked (domain, image, idx, error); mono_error_cleanup (error); + MONO_EXIT_GC_UNSAFE; return result; } |