Fix on-demand initialization race conditions [native-library.c]. (mono/mono#18162)
authorJay Krell <jaykrell@microsoft.com>
Fri, 13 Dec 2019 00:26:07 +0000 (16:26 -0800)
committermonojenkins <jo.shields+jenkins@xamarin.com>
Fri, 13 Dec 2019 00:26:07 +0000 (01:26 +0100)
Fix on-demand initialization race conditions [native-library.c].

Extracted from https://github.com/mono/mono/pull/18150 which reviewer said was too big.

Commit migrated from https://github.com/mono/mono/commit/943a2760ec6fafadd73cc59e1f4f40d5959842d7

src/mono/mono/metadata/native-library.c

index c82ce66..6dfb89b 100644 (file)
@@ -544,16 +544,15 @@ netcore_resolve_with_dll_import_resolver (MonoAssemblyLoadContext *alc, MonoAsse
        gpointer lib = NULL;
        MonoDomain *domain = mono_alc_domain (alc);
 
-       static MonoMethod *resolve;
+       MONO_STATIC_POINTER_INIT (MonoMethod, resolve)
 
-       if (!resolve) {
                ERROR_DECL (local_error);
                MonoClass *native_lib_class = mono_class_get_native_library_class ();
                g_assert (native_lib_class);
-               MonoMethod *m = mono_class_get_method_from_name_checked (native_lib_class, "MonoLoadLibraryCallbackStub", -1, 0, local_error);
+               resolve = mono_class_get_method_from_name_checked (native_lib_class, "MonoLoadLibraryCallbackStub", -1, 0, local_error);
                mono_error_assert_ok (local_error);
-               resolve = m;
-       }
+
+       MONO_STATIC_POINTER_INIT_END (MonoMethod, resolve)
        g_assert (resolve);
 
        if (mono_runtime_get_no_exec ())
@@ -605,16 +604,15 @@ netcore_resolve_with_load (MonoAssemblyLoadContext *alc, const char *scope, Mono
        MonoDl *result = NULL;
        gpointer lib = NULL;
 
-       static MonoMethod *resolve;
+       MONO_STATIC_POINTER_INIT (MonoMethod, resolve)
 
-       if (!resolve) {
                ERROR_DECL (local_error);
                MonoClass *alc_class = mono_class_get_assembly_load_context_class ();
                g_assert (alc_class);
-               MonoMethod *m = mono_class_get_method_from_name_checked (alc_class, "MonoResolveUnmanagedDll", -1, 0, local_error);
+               resolve = mono_class_get_method_from_name_checked (alc_class, "MonoResolveUnmanagedDll", -1, 0, local_error);
                mono_error_assert_ok (local_error);
-               resolve = m;
-       }
+
+       MONO_STATIC_POINTER_INIT_END (MonoMethod, resolve)
        g_assert (resolve);
 
        if (mono_runtime_get_no_exec ())
@@ -663,16 +661,15 @@ netcore_resolve_with_resolving_event (MonoAssemblyLoadContext *alc, MonoAssembly
        gpointer lib = NULL;
        MonoDomain *domain = mono_alc_domain (alc);
 
-       static MonoMethod *resolve;
+       MONO_STATIC_POINTER_INIT (MonoMethod, resolve)
 
-       if (!resolve) {
                ERROR_DECL (local_error);
                MonoClass *alc_class = mono_class_get_assembly_load_context_class ();
                g_assert (alc_class);
-               MonoMethod *m = mono_class_get_method_from_name_checked (alc_class, "MonoResolveUnmanagedDllUsingEvent", -1, 0, local_error);
+               resolve = mono_class_get_method_from_name_checked (alc_class, "MonoResolveUnmanagedDllUsingEvent", -1, 0, local_error);
                mono_error_assert_ok (local_error);
-               resolve = m;
-       }
+
+       MONO_STATIC_POINTER_INIT_END (MonoMethod, resolve)
        g_assert (resolve);
 
        if (mono_runtime_get_no_exec ())