Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormonojenkins <jo.shields+jenkins@xamarin.com>2020-03-20 06:57:43 +0300
committerGitHub <noreply@github.com>2020-03-20 06:57:43 +0300
commitf0784b26ddbc745416c91c34ca0564b7ae3b5869 (patch)
tree530cc5716622a9f739022e7e954321227b104d8d
parentd90665a422e9f8d015585b3ca381d74faa033cc4 (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.c18
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;
}