[Coop] Remove handles from Mono.Interop.ComInteropProxy. (mono/mono#16993)
authorJay Krell <jaykrell@microsoft.com>
Wed, 8 Jan 2020 18:34:11 +0000 (10:34 -0800)
committerAleksey Kliger (λgeek) <alklig@microsoft.com>
Wed, 8 Jan 2020 18:34:11 +0000 (13:34 -0500)
Commit migrated from https://github.com/mono/mono/commit/e8d38961eedfc4d5575ec264483bbe9dbdd59282

src/mono/configure.ac
src/mono/mono/metadata/cominterop.c
src/mono/mono/metadata/icall-decl.h
src/mono/mono/metadata/icall-def.h

index 2f920d6..aa43e4e 100644 (file)
@@ -63,7 +63,7 @@ MONO_VERSION_BUILD=`echo $VERSION | cut -d . -f 3`
 # This line is parsed by tools besides autoconf, such as msvc/mono.winconfig.targets.
 # It should remain in the format they expect.
 #
-MONO_CORLIB_VERSION=EEEBAE82-DB4F-4A2C-977F-7C83DE83E547
+MONO_CORLIB_VERSION=8AF7738D-0093-49BA-8C4B-C96C913FCE0F
 
 #
 # Put a quoted #define in config.h.
index 354c9b6..9ec1d0f 100644 (file)
@@ -1894,10 +1894,10 @@ ves_icall_System_ComObject_GetInterfaceInternal (MonoComObjectHandle obj, MonoRe
 }
 
 void
-ves_icall_Mono_Interop_ComInteropProxy_AddProxy (gpointer pUnk, MonoComInteropProxyHandle proxy, MonoError *error)
+ves_icall_Mono_Interop_ComInteropProxy_AddProxy (gpointer pUnk, MonoComInteropProxy *volatile* proxy_handle)
 {
 #ifndef DISABLE_COM
-       guint32 const gchandle = mono_gchandle_new_weakref_from_handle (MONO_HANDLE_CAST (MonoObject, proxy));
+       guint32 const gchandle = mono_gchandle_new_weakref_internal ((MonoObject*)*proxy_handle, FALSE);
 
        mono_cominterop_lock ();
        if (!rcw_hash)
@@ -1909,10 +1909,13 @@ ves_icall_Mono_Interop_ComInteropProxy_AddProxy (gpointer pUnk, MonoComInteropPr
 #endif
 }
 
-MonoComInteropProxyHandle
-ves_icall_Mono_Interop_ComInteropProxy_FindProxy (gpointer pUnk, MonoError *error)
+void
+ves_icall_Mono_Interop_ComInteropProxy_FindProxy (gpointer pUnk, MonoComInteropProxy *volatile* proxy_handle)
 {
+       *proxy_handle = NULL;
+
 #ifndef DISABLE_COM
+
        gchandle_t gchandle = 0;
 
        mono_cominterop_lock ();
@@ -1920,17 +1923,20 @@ ves_icall_Mono_Interop_ComInteropProxy_FindProxy (gpointer pUnk, MonoError *erro
                gchandle = GPOINTER_TO_UINT (g_hash_table_lookup (rcw_hash, pUnk));
        mono_cominterop_unlock ();
        if (!gchandle)
-               return MONO_HANDLE_NEW (MonoComInteropProxy, NULL);
+               return;
 
-       MonoComInteropProxyHandle const proxy = MONO_HANDLE_CAST (MonoComInteropProxy, mono_gchandle_get_target_handle (gchandle));
+       MonoComInteropProxy *proxy = (MonoComInteropProxy*)mono_gchandle_get_target_internal (gchandle);
+       // proxy_handle is assumed to be on the stack, so no barrier is needed.
+       *proxy_handle = proxy;
        /* proxy is null means we need to free up old RCW */
-       if (MONO_HANDLE_IS_NULL (proxy)) {
+       if (!proxy) {
                mono_gchandle_free_internal (gchandle);
                g_hash_table_remove (rcw_hash, pUnk);
        }
-       return proxy;
+
 #else
        g_assert_not_reached ();
+
 #endif
 }
 
index ab14707..de4b213 100644 (file)
@@ -245,6 +245,8 @@ ICALL_EXPORT MonoBoolean ves_icall_Mono_Security_Cryptography_KeyPairPersistence
 ICALL_EXPORT MonoBoolean ves_icall_Mono_Security_Cryptography_KeyPairPersistence_IsUserProtected (const gunichar2*);
 ICALL_EXPORT MonoBoolean ves_icall_Mono_Security_Cryptography_KeyPairPersistence_ProtectMachine (const gunichar2*);
 ICALL_EXPORT MonoBoolean ves_icall_Mono_Security_Cryptography_KeyPairPersistence_ProtectUser (const gunichar2*);
+ICALL_EXPORT void ves_icall_Mono_Interop_ComInteropProxy_AddProxy  (gpointer pUnk, MonoComInteropProxy *volatile* proxy_handle);
+ICALL_EXPORT void ves_icall_Mono_Interop_ComInteropProxy_FindProxy (gpointer pUnk, MonoComInteropProxy *volatile* proxy_handle);
 
 ICALL_EXPORT gpointer    ves_icall_System_Net_Sockets_Socket_Accept_icall (gsize, gint32*, MonoBoolean);
 ICALL_EXPORT gint32      ves_icall_System_Net_Sockets_Socket_Available_icall (gsize, gint32*);
index 6e43690..524bb0b 100644 (file)
@@ -129,8 +129,8 @@ NOHANDLES(ICALL(NATIVEMETHODS_11, "WaitForInputIdle", ves_icall_Microsoft_Win32_
 
 #ifndef DISABLE_COM
 ICALL_TYPE(COMPROX, "Mono.Interop.ComInteropProxy", COMPROX_1)
-HANDLES(COMPROX_1, "AddProxy", ves_icall_Mono_Interop_ComInteropProxy_AddProxy, void, 2, (gpointer,MonoComInteropProxy))
-HANDLES(COMPROX_2, "FindProxy", ves_icall_Mono_Interop_ComInteropProxy_FindProxy, MonoComInteropProxy, 1, (gpointer))
+NOHANDLES(ICALL(COMPROX_1, "AddProxy", ves_icall_Mono_Interop_ComInteropProxy_AddProxy))
+NOHANDLES(ICALL(COMPROX_2, "FindProxy", ves_icall_Mono_Interop_ComInteropProxy_FindProxy))
 #endif
 
 ICALL_TYPE(TLS_PROVIDER_FACTORY, "Mono.Net.Security.MonoTlsProviderFactory", TLS_PROVIDER_FACTORY_1)