未验证 提交 888601aa 编写于 作者: F Fan Yang 提交者: GitHub

[Mono] Fix memory leak during data registration (#54045)

* Fix memory leak

* Update src/mono/mono/mini/mini-generic-sharing.c
Co-authored-by: NAleksey Kliger (λgeek) <akliger@gmail.com>

* Update src/mono/mono/mini/mini-generic-sharing.c
Co-authored-by: NAleksey Kliger (λgeek) <akliger@gmail.com>

* Fix the return
Co-authored-by: NAleksey Kliger (λgeek) <akliger@gmail.com>
上级 ccc3d9f1
......@@ -2794,6 +2794,7 @@ mini_rgctx_info_type_to_patch_info_type (MonoRgctxInfoType info_type)
* @method: a method
* @in_mrgctx: whether to put the data into the MRGCTX
* @data: the info data
* @did_register: whether data was registered
* @info_type: the type of info to register about data
* @generic_context: a generic context
*
......@@ -2802,7 +2803,7 @@ mini_rgctx_info_type_to_patch_info_type (MonoRgctxInfoType info_type)
* encoded slot number.
*/
static guint32
lookup_or_register_info (MonoMemoryManager *mem_manager, MonoClass *klass, MonoMethod *method, gboolean in_mrgctx, gpointer data,
lookup_or_register_info (MonoMemoryManager *mem_manager, MonoClass *klass, MonoMethod *method, gboolean in_mrgctx, gpointer data, gboolean *did_register,
MonoRgctxInfoType info_type, MonoGenericContext *generic_context)
{
int type_argc = 0;
......@@ -2851,7 +2852,10 @@ lookup_or_register_info (MonoMemoryManager *mem_manager, MonoClass *klass, MonoM
/* We haven't found the info */
if (index == -1)
{
index = register_info (klass, type_argc, data, info_type);
*did_register = TRUE;
}
/* interlocked by loader lock */
if (index > UnlockedRead (&rgctx_max_slot_number))
......@@ -4232,6 +4236,8 @@ int
mini_get_rgctx_entry_slot (MonoJumpInfoRgctxEntry *entry)
{
gpointer entry_data = NULL;
gboolean did_register = FALSE;
guint32 result = -1;
switch (entry->data->type) {
case MONO_PATCH_INFO_CLASS:
......@@ -4302,9 +4308,27 @@ mini_get_rgctx_entry_slot (MonoJumpInfoRgctxEntry *entry)
MonoJitMemoryManager *jit_mm = get_default_jit_mm ();
if (entry->in_mrgctx)
return lookup_or_register_info (jit_mm->mem_manager, entry->d.method->klass, entry->d.method, entry->in_mrgctx, entry_data, entry->info_type, mono_method_get_context (entry->d.method));
result = lookup_or_register_info (jit_mm->mem_manager, entry->d.method->klass, entry->d.method, entry->in_mrgctx, entry_data, &did_register, entry->info_type, mono_method_get_context (entry->d.method));
else
return lookup_or_register_info (jit_mm->mem_manager, entry->d.klass, NULL, entry->in_mrgctx, entry_data, entry->info_type, mono_class_get_context (entry->d.klass));
result = lookup_or_register_info (jit_mm->mem_manager, entry->d.klass, NULL, entry->in_mrgctx, entry_data, &did_register, entry->info_type, mono_class_get_context (entry->d.klass));
if (!did_register)
switch (entry->data->type) {
case MONO_PATCH_INFO_GSHAREDVT_CALL:
case MONO_PATCH_INFO_VIRT_METHOD:
case MONO_PATCH_INFO_DELEGATE_TRAMPOLINE:
g_free (entry_data);
break;
case MONO_PATCH_INFO_GSHAREDVT_METHOD: {
g_free (((MonoGSharedVtMethodInfo *) entry_data)->entries);
g_free (entry_data);
break;
}
default :
break;
}
return result;
}
static gboolean gsharedvt_supported;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册