[Fix] Don't leak function descriptors on ia64 and ppc64.
authorTak <levi@unity3d.com>
Fri, 13 May 2011 12:10:14 +0000 (14:10 +0200)
committerTak <levi@unity3d.com>
Fri, 13 May 2011 12:10:14 +0000 (14:10 +0200)
 * metadata/domain.c:
 * metadata/domain-internals.h: Cache function descriptors for domain.
 * mini.c: Use cache when creating function pointer descriptors.

License: MIT/X11

mono/metadata/domain-internals.h
mono/metadata/domain.c
mono/mini/mini.c

index 139a81107c5819d1ce5cc9a7446cc91e30cc3229..0ad401dd37556c9ec4f308802baaf9bb0292942d 100644 (file)
@@ -342,6 +342,12 @@ struct _MonoDomain {
        MonoClass *socket_class;
        MonoClass *ad_unloaded_ex_class;
        MonoClass *process_class;
+
+       /* Cache function pointers for architectures  */
+       /* that require wrappers */
+#if defined(__ia64__) || defined(__ppc64__) || defined(__powerpc64__)
+       GHashTable *ftnptrs_hash;
+#endif
 };
 
 typedef struct  {
index fb478e93a279a22557c3817b89572cef473dcf5c..8fa1b02fd2565844f967a8bb94d3c575516e4035 100644 (file)
@@ -1243,6 +1243,9 @@ mono_init_internal (const char *filename, const char *exe_filename, const char *
        /* Avoid system error message boxes. */
        SetErrorMode (SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX);
 #endif
+#if defined(__ia64__) || defined(__ppc64__) || defined(__powerpc64__)
+       domain->ftnptrs_hash = g_hash_table_new (mono_aligned_addr_hash, NULL);
+#endif
 
        mono_perfcounters_init ();
 
@@ -2046,6 +2049,12 @@ mono_domain_free (MonoDomain *domain, gboolean force)
                g_hash_table_destroy (domain->generic_virtual_thunks);
                domain->generic_virtual_thunks = NULL;
        }
+#if defined(__ia64__) || defined(__ppc64__) || defined(__powerpc64__)
+       if (domain->ftnptrs_hash) {
+               g_hash_table_destroy (domain->ftnptrs_hash);
+               domain->ftnptrs_hash = NULL;
+       }
+#endif
 
        DeleteCriticalSection (&domain->finalizable_objects_hash_lock);
        DeleteCriticalSection (&domain->assemblies_lock);
index 9aad4e2a18368ab8a0805225337e6583522d9d58..39a0f4d77e62ffab82ccb6bb555ecd5e6ca61715 100644 (file)
@@ -6029,16 +6029,20 @@ mini_get_debug_options (void)
 static gpointer
 mini_create_ftnptr (MonoDomain *domain, gpointer addr)
 {
-#ifdef __ia64__
-       gpointer *desc;
+#if !defined(__ia64__) && !defined(__ppc64__) && !defined(__powerpc64__)
+       return addr;
+#else
 
+       gpointer* desc = NULL;
+
+       if ((desc = g_hash_table_lookup (domain->ftnptrs_hash, addr)))
+               return desc;
+#      ifdef __ia64__
        desc = mono_domain_code_reserve (domain, 2 * sizeof (gpointer));
 
        desc [0] = addr;
        desc [1] = NULL;
-
-       return desc;
-#elif defined(__ppc64__) || defined(__powerpc64__)
+#      elif defined(__ppc64__) || defined(__powerpc64__)
        gpointer *desc;
 
        desc = mono_domain_alloc0 (domain, 3 * sizeof (gpointer));
@@ -6046,10 +6050,9 @@ mini_create_ftnptr (MonoDomain *domain, gpointer addr)
        desc [0] = addr;
        desc [1] = NULL;
        desc [2] = NULL;
-
+#      endif
+       g_hash_table_insert (domain->ftnptrs_hash, addr, desc);
        return desc;
-#else
-       return addr;
 #endif
 }