From: Jay Krell Date: Wed, 8 Jan 2020 18:34:11 +0000 (-0800) Subject: [Coop] Remove handles from Mono.Interop.ComInteropProxy. (mono/mono#16993) X-Git-Tag: submit/tizen/20210909.063632~10331^2~5^2~38 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6891bc536efcaa85561965be71798c1032ca1250;p=platform%2Fupstream%2Fdotnet%2Fruntime.git [Coop] Remove handles from Mono.Interop.ComInteropProxy. (mono/mono#16993) Commit migrated from https://github.com/mono/mono/commit/e8d38961eedfc4d5575ec264483bbe9dbdd59282 --- diff --git a/src/mono/configure.ac b/src/mono/configure.ac index 2f920d6..aa43e4e 100644 --- a/src/mono/configure.ac +++ b/src/mono/configure.ac @@ -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. diff --git a/src/mono/mono/metadata/cominterop.c b/src/mono/mono/metadata/cominterop.c index 354c9b6..9ec1d0f 100644 --- a/src/mono/mono/metadata/cominterop.c +++ b/src/mono/mono/metadata/cominterop.c @@ -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 } diff --git a/src/mono/mono/metadata/icall-decl.h b/src/mono/mono/metadata/icall-decl.h index ab14707..de4b213 100644 --- a/src/mono/mono/metadata/icall-decl.h +++ b/src/mono/mono/metadata/icall-decl.h @@ -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*); diff --git a/src/mono/mono/metadata/icall-def.h b/src/mono/mono/metadata/icall-def.h index 6e43690..524bb0b 100644 --- a/src/mono/mono/metadata/icall-def.h +++ b/src/mono/mono/metadata/icall-def.h @@ -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)