From 5bd322de33660e846ad539490de4149b47ceb5fb Mon Sep 17 00:00:00 2001 From: Jay Krell Date: Wed, 16 Oct 2019 05:25:55 -0700 Subject: [PATCH] Replace mono_assembly_name_free use with mono_assembly_name_free_internal. (mono/mono#16982) Replace mono_assembly_name_free use with mono_assembly_name_free_internal. Maybe just remove the GC mode change and remove the internal form. We don't really equate malloc/free with GC/locks/hangs, though arguably we should. Arguably this change is right. Commit migrated from https://github.com/mono/mono/commit/a03027cab08e9b2caddef8cdd8b62b8d2d6430c8 --- src/mono/mono/metadata/appdomain.c | 2 +- src/mono/mono/metadata/assembly.c | 32 ++++++++++++-------------------- src/mono/mono/metadata/assembly.h | 2 +- src/mono/mono/metadata/external-only.c | 16 ++++++++++++++++ src/mono/mono/metadata/icall.c | 2 +- src/mono/mono/mini/mini-wasm-debugger.c | 3 ++- 6 files changed, 33 insertions(+), 24 deletions(-) diff --git a/src/mono/mono/metadata/appdomain.c b/src/mono/mono/metadata/appdomain.c index c5ec278..63b86b4 100644 --- a/src/mono/mono/metadata/appdomain.c +++ b/src/mono/mono/metadata/appdomain.c @@ -2790,7 +2790,7 @@ ves_icall_System_AppDomain_LoadAssembly (MonoAppDomainHandle ad, MonoStringHandl req.basedir = basedir; req.no_postload_search = TRUE; ass = mono_assembly_request_byname (&aname, &req, &status); - mono_assembly_name_free (&aname); + mono_assembly_name_free_internal (&aname); if (!ass) { /* MS.NET doesn't seem to call the assembly resolve handler for refonly assemblies */ diff --git a/src/mono/mono/metadata/assembly.c b/src/mono/mono/metadata/assembly.c index fc76569..0f76295 100644 --- a/src/mono/mono/metadata/assembly.c +++ b/src/mono/mono/metadata/assembly.c @@ -2863,7 +2863,7 @@ mono_assembly_binding_applies_to_image (MonoAssemblyLoadContext *alc, MonoImage* *status = new_status; } } - mono_assembly_name_free (&probed_aname); + mono_assembly_name_free_internal (&probed_aname); return result_ass; } @@ -2922,7 +2922,7 @@ mono_problematic_image_reprobe (MonoAssemblyLoadContext *alc, MonoImage *image, if (! (result_ass && new_status == MONO_IMAGE_OK)) { *status = new_status; } - mono_assembly_name_free (&probed_aname); + mono_assembly_name_free_internal (&probed_aname); return result_ass; } /** @@ -3188,21 +3188,13 @@ mono_assembly_load_from (MonoImage *image, const char *fname, } /** - * mono_assembly_name_free: + * mono_assembly_name_free_internal: * \param aname assembly name to free * * Frees the provided assembly name object. * (it does not frees the object itself, only the name members). */ void -mono_assembly_name_free (MonoAssemblyName *aname) -{ - MONO_ENTER_GC_UNSAFE; - mono_assembly_name_free_internal (aname); - MONO_EXIT_GC_UNSAFE; -} - -void mono_assembly_name_free_internal (MonoAssemblyName *aname) { MONO_REQ_GC_UNSAFE_MODE; @@ -3384,7 +3376,7 @@ build_assembly_name (const char *name, const char *version, const char *culture, /* the constant includes the ending NULL, hence the -1 */ if (strlen (token) != (MONO_PUBLIC_KEY_TOKEN_LENGTH - 1)) { - mono_assembly_name_free (aname); + mono_assembly_name_free_internal (aname); return FALSE; } lower = g_ascii_strdown (token, MONO_PUBLIC_KEY_TOKEN_LENGTH); @@ -3396,7 +3388,7 @@ build_assembly_name (const char *name, const char *version, const char *culture, gboolean is_ecma = FALSE; gchar *pkey = NULL; if (strcmp (key, "null") == 0 || !parse_public_key (key, &pkey, &is_ecma)) { - mono_assembly_name_free (aname); + mono_assembly_name_free_internal (aname); return FALSE; } @@ -3817,7 +3809,7 @@ probe_for_partial_name (const char *basepath, const char *fullname, MonoAssembly fullpath = g_build_path (G_DIR_SEPARATOR_S, basepath, direntry, fullname, (const char*)NULL); } - mono_assembly_name_free (&gac_aname); + mono_assembly_name_free_internal (&gac_aname); } g_dir_close (dirhandle); @@ -3890,14 +3882,14 @@ mono_assembly_load_with_partial_name_internal (const char *name, MonoAssemblyLoa res = mono_assembly_loaded_internal (alc, aname, FALSE); if (res) { - mono_assembly_name_free (aname); + mono_assembly_name_free_internal (aname); return res; } res = invoke_assembly_preload_hook (alc, aname, assemblies_path); if (res) { res->in_gac = FALSE; - mono_assembly_name_free (aname); + mono_assembly_name_free_internal (aname); return res; } @@ -3919,7 +3911,7 @@ mono_assembly_load_with_partial_name_internal (const char *name, MonoAssemblyLoa if (res) { res->in_gac = TRUE; g_free (fullname); - mono_assembly_name_free (aname); + mono_assembly_name_free_internal (aname); return res; } @@ -3932,7 +3924,7 @@ mono_assembly_load_with_partial_name_internal (const char *name, MonoAssemblyLoa res->in_gac = TRUE; #endif - mono_assembly_name_free (aname); + mono_assembly_name_free_internal (aname); if (!res) { res = mono_try_assembly_resolve (alc, name, NULL, FALSE, error); @@ -4469,7 +4461,7 @@ mono_assembly_load_corlib (const MonoRuntimeInfo *runtime, MonoImageOpenStatus * // A nonstandard preload hook may provide a special mscorlib assembly aname = mono_assembly_name_new ("mscorlib.dll"); corlib = invoke_assembly_preload_hook (req.request.alc, aname, assemblies_path); - mono_assembly_name_free (aname); + mono_assembly_name_free_internal (aname); g_free (aname); if (corlib != NULL) goto return_corlib_and_facades; @@ -4914,7 +4906,7 @@ mono_assembly_close_except_image_pools (MonoAssembly *assembly) for (tmp = assembly->friend_assembly_names; tmp; tmp = tmp->next) { MonoAssemblyName *fname = (MonoAssemblyName *)tmp->data; - mono_assembly_name_free (fname); + mono_assembly_name_free_internal (fname); g_free (fname); } g_slist_free (assembly->friend_assembly_names); diff --git a/src/mono/mono/metadata/assembly.h b/src/mono/mono/metadata/assembly.h index 272e4fc..b5b3127 100644 --- a/src/mono/mono/metadata/assembly.h +++ b/src/mono/mono/metadata/assembly.h @@ -113,7 +113,7 @@ MONO_API const char* mono_assembly_name_get_culture (MonoAssemblyName MONO_API uint16_t mono_assembly_name_get_version (MonoAssemblyName *aname, uint16_t *minor, uint16_t *build, uint16_t *revision); MONO_API mono_byte* mono_assembly_name_get_pubkeytoken (MonoAssemblyName *aname); -MONO_API void mono_assembly_name_free (MonoAssemblyName *aname); +MONO_API MONO_RT_EXTERNAL_ONLY void mono_assembly_name_free (MonoAssemblyName *aname); typedef struct { const char *name; diff --git a/src/mono/mono/metadata/external-only.c b/src/mono/mono/metadata/external-only.c index 6cfe94d..370fb3c9 100644 --- a/src/mono/mono/metadata/external-only.c +++ b/src/mono/mono/metadata/external-only.c @@ -19,6 +19,7 @@ #include "class-init.h" #include "marshal.h" #include "object.h" +#include "assembly-internals.h" #include "external-only.h" /** @@ -323,3 +324,18 @@ mono_domain_set (MonoDomain *domain, gboolean force) MONO_EXTERNAL_ONLY_GC_UNSAFE_VOID (mono_domain_set_internal_with_options (domain, TRUE)); return TRUE; } + +/** + * mono_assembly_name_free: + * \param aname assembly name to free + * + * Frees the provided assembly name object. + * (it does not frees the object itself, only the name members). + */ +void +mono_assembly_name_free (MonoAssemblyName *aname) +{ + if (!aname) + return; + MONO_EXTERNAL_ONLY_GC_UNSAFE_VOID (mono_assembly_name_free_internal (aname)); +} diff --git a/src/mono/mono/metadata/icall.c b/src/mono/mono/metadata/icall.c index 576e668..b5acdb6 100644 --- a/src/mono/mono/metadata/icall.c +++ b/src/mono/mono/metadata/icall.c @@ -6264,7 +6264,7 @@ ves_icall_System_Reflection_RuntimeAssembly_GetTopLevelForwardedTypes (MonoRefle void ves_icall_Mono_RuntimeMarshal_FreeAssemblyName (MonoAssemblyName *aname, MonoBoolean free_struct, MonoError *error) { - mono_assembly_name_free (aname); + mono_assembly_name_free_internal (aname); if (free_struct) g_free (aname); } diff --git a/src/mono/mono/mini/mini-wasm-debugger.c b/src/mono/mono/mini/mini-wasm-debugger.c index fd34e21..42554d2 100644 --- a/src/mono/mono/mini/mini-wasm-debugger.c +++ b/src/mono/mono/mini/mini-wasm-debugger.c @@ -15,6 +15,7 @@ #include +#include "mono/metadata/assembly-internals.h" static int log_level = 1; @@ -413,7 +414,7 @@ mono_wasm_set_breakpoint (const char *assembly_name, int method_token, int il_of return -1; } - mono_assembly_name_free (aname); + mono_assembly_name_free_internal (aname); MonoMethod *method = mono_get_method_checked (assembly->image, MONO_TOKEN_METHOD_DEF | method_token, NULL, NULL, error); if (!method) { -- 2.7.4