提交 03b6e7c0 编写于 作者: T Tak

[Fix] Don't leak function descriptors on ia64 and ppc64.

 * metadata/domain.c:
 * metadata/domain-internals.h: Cache function descriptors for domain.
 * mini.c: Use cache when creating function pointer descriptors.

License: MIT/X11
上级 30f1fab0
......@@ -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 {
......
......@@ -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);
......
......@@ -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
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册