From ceac1590dfeaefe8ca59cf5088e632958862d7e9 Mon Sep 17 00:00:00 2001 From: "D.S. Qiu" Date: Wed, 24 Nov 2021 09:57:06 +0800 Subject: [PATCH 01/13] mono_runtime_delegate_invoke wrapper with MONO_ENTER_GC_UNSAFE/MONO_EXIT_GC_UNSAFE; mono_runtime_delegate_invoke wrapper with MONO_ENTER_GC_UNSAFE/MONO_EXIT_GC_UNSAFE; --- src/mono/mono/metadata/object.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/mono/mono/metadata/object.c b/src/mono/mono/metadata/object.c index 70f77b0495c495..1529e02ff92e2a 100644 --- a/src/mono/mono/metadata/object.c +++ b/src/mono/mono/metadata/object.c @@ -3714,24 +3714,25 @@ mono_get_delegate_end_invoke_checked (MonoClass *klass, MonoError *error) MonoObject* mono_runtime_delegate_invoke (MonoObject *delegate, void **params, MonoObject **exc) { - MONO_REQ_GC_UNSAFE_MODE; - ERROR_DECL (error); + MonoObject* result = NULL; + MONO_ENTER_GC_UNSAFE; if (exc) { - MonoObject *result = mono_runtime_delegate_try_invoke (delegate, params, exc, error); + result = mono_runtime_delegate_try_invoke (delegate, params, exc, error); if (*exc) { mono_error_cleanup (error); - return NULL; + result = NULL; } else { if (!is_ok (error)) *exc = (MonoObject*)mono_error_convert_to_exception (error); - return result; } } else { MonoObject *result = mono_runtime_delegate_invoke_checked (delegate, params, error); mono_error_raise_exception_deprecated (error); /* OK to throw, external only without a good alternative */ - return result; + } + MONO_EXIT_GC_UNSAFE; + return result; } /** From a56b0cf7753191b14322008216d25163e9e31ef3 Mon Sep 17 00:00:00 2001 From: "D.S. Qiu" Date: Wed, 24 Nov 2021 10:12:43 +0800 Subject: [PATCH 02/13] Update object.c --- src/mono/mono/metadata/object.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mono/mono/metadata/object.c b/src/mono/mono/metadata/object.c index 1529e02ff92e2a..7def77c718f468 100644 --- a/src/mono/mono/metadata/object.c +++ b/src/mono/mono/metadata/object.c @@ -3727,7 +3727,7 @@ mono_runtime_delegate_invoke (MonoObject *delegate, void **params, MonoObject ** *exc = (MonoObject*)mono_error_convert_to_exception (error); } } else { - MonoObject *result = mono_runtime_delegate_invoke_checked (delegate, params, error); + result = mono_runtime_delegate_invoke_checked (delegate, params, error); mono_error_raise_exception_deprecated (error); /* OK to throw, external only without a good alternative */ } From 60007d9a9e347f378384a39d6a72aa663cee9afa Mon Sep 17 00:00:00 2001 From: "D.S. Qiu" Date: Mon, 3 Apr 2023 19:57:48 +0800 Subject: [PATCH 03/13] add mono_alc_foreach --- src/mono/mono/metadata/loader-internals.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/mono/mono/metadata/loader-internals.h b/src/mono/mono/metadata/loader-internals.h index d58404aff6b693..05cd589e390784 100644 --- a/src/mono/mono/metadata/loader-internals.h +++ b/src/mono/mono/metadata/loader-internals.h @@ -227,6 +227,11 @@ mono_set_pinvoke_search_directories (int dir_count, char **dirs); void mono_alcs_init (void); +typedef void (*MonoALCFunc) (MonoAssemblyLoadContext *alc, gpointer user_data); + +void +mono_alc_foreach (MonoALCFunc func, gpointer user_data); + void mono_alc_create_default (MonoDomain *domain); From a841d5f75da86be0d2afbd47abf297eb038aef7c Mon Sep 17 00:00:00 2001 From: "D.S. Qiu" Date: Mon, 3 Apr 2023 19:58:49 +0800 Subject: [PATCH 04/13] implmented mono_alc_foreach --- src/mono/mono/metadata/assembly-load-context.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/mono/mono/metadata/assembly-load-context.c b/src/mono/mono/metadata/assembly-load-context.c index 04aaeaaef826f4..e7235d2d14ca5e 100644 --- a/src/mono/mono/metadata/assembly-load-context.c +++ b/src/mono/mono/metadata/assembly-load-context.c @@ -84,6 +84,14 @@ mono_alcs_init (void) default_alc->gchandle = mono_gchandle_new_internal (NULL, FALSE); } +void +mono_alc_foreach (MonoALCFunc func, gpointer user_data) +{ + alcs_lock (); + g_slist_foreach (alcs, func, user_data); + alcs_unlock (); +} + MonoAssemblyLoadContext * mono_alc_get_default (void) { From b5725dbc5c8485949aa76e1183adbbc08d3ae4d4 Mon Sep 17 00:00:00 2001 From: "D.S. Qiu" Date: Mon, 3 Apr 2023 20:02:25 +0800 Subject: [PATCH 05/13] Update loader-internals.h --- src/mono/mono/metadata/loader-internals.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mono/mono/metadata/loader-internals.h b/src/mono/mono/metadata/loader-internals.h index 05cd589e390784..726132e3363c78 100644 --- a/src/mono/mono/metadata/loader-internals.h +++ b/src/mono/mono/metadata/loader-internals.h @@ -227,7 +227,7 @@ mono_set_pinvoke_search_directories (int dir_count, char **dirs); void mono_alcs_init (void); -typedef void (*MonoALCFunc) (MonoAssemblyLoadContext *alc, gpointer user_data); +typedef void (*MonoALCFunc) (void *alc, gpointer user_data); void mono_alc_foreach (MonoALCFunc func, gpointer user_data); From 47ecbf26cf2a049286ba718146395b7936b5fb39 Mon Sep 17 00:00:00 2001 From: "D.S. Qiu" Date: Mon, 3 Apr 2023 20:21:58 +0800 Subject: [PATCH 06/13] fix get_default_jit_mm() --- src/mono/mono/mini/interp/interp.c | 46 +++++++++++++++++++++--------- 1 file changed, 33 insertions(+), 13 deletions(-) diff --git a/src/mono/mono/mini/interp/interp.c b/src/mono/mono/mini/interp/interp.c index 294b395f18783b..f553386ed72844 100644 --- a/src/mono/mono/mini/interp/interp.c +++ b/src/mono/mono/mini/interp/interp.c @@ -80,6 +80,7 @@ #include #include +#include #ifdef TARGET_ARM #include @@ -8592,6 +8593,17 @@ metadata_update_prepare_to_invalidate (void) } +static void +interp_invalidate_transformed_func (void* data, gpointer user_data) +{ + MonoAssemblyLoadContext* alc = (MonoAssemblyLoadContext*)data; + MonoJitMemoryManager *jit_mm = (MonoJitMemoryManager*)alc->mem_manager->runtime_info; + + jit_mm_lock (jit_mm); + mono_internal_hash_table_apply (&jit_mm->interp_code_hash, invalidate_transform, NULL); + jit_mm_unlock (jit_mm); +} + static void interp_invalidate_transformed (void) { @@ -8602,12 +8614,7 @@ interp_invalidate_transformed (void) need_stw_restart = TRUE; } - // FIXME: Enumerate all memory managers - MonoJitMemoryManager *jit_mm = get_default_jit_mm (); - - jit_mm_lock (jit_mm); - mono_internal_hash_table_apply (&jit_mm->interp_code_hash, invalidate_transform, NULL); - jit_mm_unlock (jit_mm); + mono_alc_foreach (interp_invalidate_transformed_func, NULL); if (need_stw_restart) mono_restart_world (MONO_THREAD_INFO_FLAGS_NO_GC); @@ -8627,14 +8634,18 @@ interp_copy_jit_info_func (gpointer imethod, gpointer user_data) data->jit_info_array [data->next++] = ((InterpMethod *)imethod)->jinfo; } -static void -interp_jit_info_foreach (InterpJitInfoFunc func, gpointer user_data) +typedef struct { + InterpJitInfoFunc func; + gpointer user_data; +} InterpJitInfoFuncUserData; + +static void +interp_jit_info_foreach_func (void* data, gpointer user_data) { + InterpJitInfoFuncUserData func_userdata = (InterpJitInfoFuncUserData*)user_data; + MonoAssemblyLoadContext* alc = (MonoAssemblyLoadContext*)data; + MonoJitMemoryManager *jit_mm = (MonoJitMemoryManager*)alc->mem_manager->runtime_info; InterpCopyJitInfoFuncUserData copy_jit_info_data; - - // FIXME: Enumerate all memory managers - MonoJitMemoryManager *jit_mm = get_default_jit_mm (); - // Can't keep memory manager lock while iterating and calling callback since it might take other locks // causing poential deadlock situations. Instead, create copy of interpreter imethod jinfo pointers into // plain array and use pointers from array when when running callbacks. @@ -8649,11 +8660,20 @@ interp_jit_info_foreach (InterpJitInfoFunc func, gpointer user_data) if (copy_jit_info_data.jit_info_array) { for (int i = 0; i < copy_jit_info_data.next; ++i) - func (copy_jit_info_data.jit_info_array [i], user_data); + func_userdata.func (copy_jit_info_data.jit_info_array [i], func_userdata.user_data); g_free (copy_jit_info_data.jit_info_array); } } +static void +interp_jit_info_foreach (InterpJitInfoFunc func, gpointer user_data) +{ + InterpJitInfoFuncUserData func_data; + func_data.func = func; + func_data.user_data = user_data; + mono_alc_foreach (interp_invalidate_transformed_func, &func_data); +} + static gboolean interp_sufficient_stack (gsize size) { From 22e636685394a4b506a6fad9737aea44f98c7328 Mon Sep 17 00:00:00 2001 From: "D.S. Qiu" Date: Mon, 3 Apr 2023 20:29:44 +0800 Subject: [PATCH 07/13] fix compiler error --- src/mono/mono/mini/interp/interp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mono/mono/mini/interp/interp.c b/src/mono/mono/mini/interp/interp.c index f553386ed72844..c688ad278f143f 100644 --- a/src/mono/mono/mini/interp/interp.c +++ b/src/mono/mono/mini/interp/interp.c @@ -8660,7 +8660,7 @@ interp_jit_info_foreach_func (void* data, gpointer user_data) if (copy_jit_info_data.jit_info_array) { for (int i = 0; i < copy_jit_info_data.next; ++i) - func_userdata.func (copy_jit_info_data.jit_info_array [i], func_userdata.user_data); + func_userdata->func (copy_jit_info_data.jit_info_array [i], func_userdata->user_data); g_free (copy_jit_info_data.jit_info_array); } } From ca0f1f77ca8123d6fd108ffe0a20ebae09db774d Mon Sep 17 00:00:00 2001 From: "D.S. Qiu" Date: Mon, 3 Apr 2023 20:56:46 +0800 Subject: [PATCH 08/13] fix type cast --- src/mono/mono/mini/interp/interp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mono/mono/mini/interp/interp.c b/src/mono/mono/mini/interp/interp.c index c688ad278f143f..18060c5dbf648f 100644 --- a/src/mono/mono/mini/interp/interp.c +++ b/src/mono/mono/mini/interp/interp.c @@ -8597,7 +8597,7 @@ static void interp_invalidate_transformed_func (void* data, gpointer user_data) { MonoAssemblyLoadContext* alc = (MonoAssemblyLoadContext*)data; - MonoJitMemoryManager *jit_mm = (MonoJitMemoryManager*)alc->mem_manager->runtime_info; + MonoJitMemoryManager *jit_mm = (MonoJitMemoryManager*)(alc->mem_manager->runtime_info); jit_mm_lock (jit_mm); mono_internal_hash_table_apply (&jit_mm->interp_code_hash, invalidate_transform, NULL); @@ -8644,7 +8644,7 @@ interp_jit_info_foreach_func (void* data, gpointer user_data) { InterpJitInfoFuncUserData func_userdata = (InterpJitInfoFuncUserData*)user_data; MonoAssemblyLoadContext* alc = (MonoAssemblyLoadContext*)data; - MonoJitMemoryManager *jit_mm = (MonoJitMemoryManager*)alc->mem_manager->runtime_info; + MonoJitMemoryManager *jit_mm = (MonoJitMemoryManager*)(alc->mem_manager->runtime_info); InterpCopyJitInfoFuncUserData copy_jit_info_data; // Can't keep memory manager lock while iterating and calling callback since it might take other locks // causing poential deadlock situations. Instead, create copy of interpreter imethod jinfo pointers into From e703a9c45183f51694293123ecdbe2e718d9f07b Mon Sep 17 00:00:00 2001 From: "D.S. Qiu" Date: Mon, 3 Apr 2023 21:26:57 +0800 Subject: [PATCH 09/13] fix compile error --- src/mono/mono/mini/interp/interp.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mono/mono/mini/interp/interp.c b/src/mono/mono/mini/interp/interp.c index 18060c5dbf648f..1ac64db777b249 100644 --- a/src/mono/mono/mini/interp/interp.c +++ b/src/mono/mono/mini/interp/interp.c @@ -8597,7 +8597,7 @@ static void interp_invalidate_transformed_func (void* data, gpointer user_data) { MonoAssemblyLoadContext* alc = (MonoAssemblyLoadContext*)data; - MonoJitMemoryManager *jit_mm = (MonoJitMemoryManager*)(alc->mem_manager->runtime_info); + MonoJitMemoryManager *jit_mm = (MonoJitMemoryManager*)(alc->memory_manager->runtime_info); jit_mm_lock (jit_mm); mono_internal_hash_table_apply (&jit_mm->interp_code_hash, invalidate_transform, NULL); @@ -8642,9 +8642,9 @@ typedef struct { static void interp_jit_info_foreach_func (void* data, gpointer user_data) { - InterpJitInfoFuncUserData func_userdata = (InterpJitInfoFuncUserData*)user_data; + InterpJitInfoFuncUserData* func_userdata = (InterpJitInfoFuncUserData*)user_data; MonoAssemblyLoadContext* alc = (MonoAssemblyLoadContext*)data; - MonoJitMemoryManager *jit_mm = (MonoJitMemoryManager*)(alc->mem_manager->runtime_info); + MonoJitMemoryManager *jit_mm = (MonoJitMemoryManager*)(alc->memory_manager->runtime_info); InterpCopyJitInfoFuncUserData copy_jit_info_data; // Can't keep memory manager lock while iterating and calling callback since it might take other locks // causing poential deadlock situations. Instead, create copy of interpreter imethod jinfo pointers into From 42df66e06c7ef89b9120e2921039b722e461d6c2 Mon Sep 17 00:00:00 2001 From: "D.S. Qiu" Date: Tue, 4 Apr 2023 04:19:21 +0800 Subject: [PATCH 10/13] change mono_alc_foreach to mono_alc_get_all --- src/mono/mono/metadata/loader-internals.h | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/mono/mono/metadata/loader-internals.h b/src/mono/mono/metadata/loader-internals.h index 726132e3363c78..8356a0bcb1dc5c 100644 --- a/src/mono/mono/metadata/loader-internals.h +++ b/src/mono/mono/metadata/loader-internals.h @@ -227,11 +227,6 @@ mono_set_pinvoke_search_directories (int dir_count, char **dirs); void mono_alcs_init (void); -typedef void (*MonoALCFunc) (void *alc, gpointer user_data); - -void -mono_alc_foreach (MonoALCFunc func, gpointer user_data); - void mono_alc_create_default (MonoDomain *domain); @@ -310,6 +305,9 @@ mono_alc_find_assembly (MonoAssemblyLoadContext *alc, MonoAssemblyName *aname); MONO_COMPONENT_API GPtrArray* mono_alc_get_all_loaded_assemblies (void); +GPtrArray* +mono_alc_get_all (void); + MONO_API void mono_loader_save_bundled_library (int fd, uint64_t offset, uint64_t size, const char *destfname); From b8e3d6762e9b562c61e2835b9010f31622dcd2cb Mon Sep 17 00:00:00 2001 From: "D.S. Qiu" Date: Tue, 4 Apr 2023 04:21:48 +0800 Subject: [PATCH 11/13] Update assembly-load-context.c --- .../mono/metadata/assembly-load-context.c | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/mono/mono/metadata/assembly-load-context.c b/src/mono/mono/metadata/assembly-load-context.c index e7235d2d14ca5e..dec9f96b6755f3 100644 --- a/src/mono/mono/metadata/assembly-load-context.c +++ b/src/mono/mono/metadata/assembly-load-context.c @@ -84,14 +84,6 @@ mono_alcs_init (void) default_alc->gchandle = mono_gchandle_new_internal (NULL, FALSE); } -void -mono_alc_foreach (MonoALCFunc func, gpointer user_data) -{ - alcs_lock (); - g_slist_foreach (alcs, func, user_data); - alcs_unlock (); -} - MonoAssemblyLoadContext * mono_alc_get_default (void) { @@ -690,6 +682,21 @@ mono_alc_get_all_loaded_assemblies (void) return assemblies; } +GPtrArray* +mono_alc_get_all (void) +{ + // FIXME: prevent the individual ALCs from being collected until the iteration is done. + GSList *tmp; + GPtrArray *all_alcs = g_ptr_array_new (); + MonoAssemblyLoadContext *alc; + alcs_lock (); + for (tmp = alcs; tmp; tmp = tmp->next) { + alc = (MonoAssemblyLoadContext *)tmp->data; + g_ptr_array_add (all_alcs, alc); + } + alcs_unlock (); + return all_alcs; +} MonoBoolean ves_icall_System_Reflection_LoaderAllocatorScout_Destroy (gpointer native) @@ -730,3 +737,4 @@ ves_icall_System_Reflection_LoaderAllocatorScout_Destroy (gpointer native) return TRUE; #endif } + From 60fd50a7ed3f50b4a333a64aafb1c3a95bf1861f Mon Sep 17 00:00:00 2001 From: "D.S. Qiu" Date: Tue, 4 Apr 2023 04:24:44 +0800 Subject: [PATCH 12/13] Update interp.c --- src/mono/mono/mini/interp/interp.c | 93 +++++++++++++++--------------- 1 file changed, 45 insertions(+), 48 deletions(-) diff --git a/src/mono/mono/mini/interp/interp.c b/src/mono/mono/mini/interp/interp.c index 1ac64db777b249..5f056c9c3bd4b5 100644 --- a/src/mono/mono/mini/interp/interp.c +++ b/src/mono/mono/mini/interp/interp.c @@ -8592,18 +8592,6 @@ metadata_update_prepare_to_invalidate (void) /* (2) invalidate all the registered imethods */ } - -static void -interp_invalidate_transformed_func (void* data, gpointer user_data) -{ - MonoAssemblyLoadContext* alc = (MonoAssemblyLoadContext*)data; - MonoJitMemoryManager *jit_mm = (MonoJitMemoryManager*)(alc->memory_manager->runtime_info); - - jit_mm_lock (jit_mm); - mono_internal_hash_table_apply (&jit_mm->interp_code_hash, invalidate_transform, NULL); - jit_mm_unlock (jit_mm); -} - static void interp_invalidate_transformed (void) { @@ -8614,12 +8602,27 @@ interp_invalidate_transformed (void) need_stw_restart = TRUE; } - mono_alc_foreach (interp_invalidate_transformed_func, NULL); + GPtrArray *alcs = mono_alc_get_all (); + + if (alcs) { + MonoAssemblyLoadContext* alc; + for (guint i = 0; i < alcs->len; ++i) { + alc = (MonoAssemblyLoadContext*)g_ptr_array_index (alcs, i); + MonoJitMemoryManager *jit_mm = (MonoJitMemoryManager*)(alc->memory_manager->runtime_info); + + jit_mm_lock (jit_mm); + mono_internal_hash_table_apply (&jit_mm->interp_code_hash, invalidate_transform, NULL); + jit_mm_unlock (jit_mm); + } + + g_ptr_array_free (alcs, TRUE); + } if (need_stw_restart) mono_restart_world (MONO_THREAD_INFO_FLAGS_NO_GC); } + typedef struct { MonoJitInfo **jit_info_array; gint size; @@ -8634,44 +8637,38 @@ interp_copy_jit_info_func (gpointer imethod, gpointer user_data) data->jit_info_array [data->next++] = ((InterpMethod *)imethod)->jinfo; } -typedef struct { - InterpJitInfoFunc func; - gpointer user_data; -} InterpJitInfoFuncUserData; - -static void -interp_jit_info_foreach_func (void* data, gpointer user_data) -{ - InterpJitInfoFuncUserData* func_userdata = (InterpJitInfoFuncUserData*)user_data; - MonoAssemblyLoadContext* alc = (MonoAssemblyLoadContext*)data; - MonoJitMemoryManager *jit_mm = (MonoJitMemoryManager*)(alc->memory_manager->runtime_info); - InterpCopyJitInfoFuncUserData copy_jit_info_data; - // Can't keep memory manager lock while iterating and calling callback since it might take other locks - // causing poential deadlock situations. Instead, create copy of interpreter imethod jinfo pointers into - // plain array and use pointers from array when when running callbacks. - copy_jit_info_data.size = mono_atomic_load_i32 (&(jit_mm->interp_code_hash.num_entries)); - copy_jit_info_data.next = 0; - copy_jit_info_data.jit_info_array = (MonoJitInfo**) g_new (MonoJitInfo*, copy_jit_info_data.size); - if (copy_jit_info_data.jit_info_array) { - jit_mm_lock (jit_mm); - mono_internal_hash_table_apply (&jit_mm->interp_code_hash, interp_copy_jit_info_func, ©_jit_info_data); - jit_mm_unlock (jit_mm); - } - - if (copy_jit_info_data.jit_info_array) { - for (int i = 0; i < copy_jit_info_data.next; ++i) - func_userdata->func (copy_jit_info_data.jit_info_array [i], func_userdata->user_data); - g_free (copy_jit_info_data.jit_info_array); - } -} - static void interp_jit_info_foreach (InterpJitInfoFunc func, gpointer user_data) { - InterpJitInfoFuncUserData func_data; - func_data.func = func; - func_data.user_data = user_data; - mono_alc_foreach (interp_invalidate_transformed_func, &func_data); + GPtrArray *alcs = mono_alc_get_all (); + + if (alcs) { + MonoAssemblyLoadContext* alc; + for (guint i = 0; i < alcs->len; ++i) { + alc = (MonoAssemblyLoadContext*)g_ptr_array_index (alcs, i); + MonoJitMemoryManager *jit_mm = (MonoJitMemoryManager*)(alc->memory_manager->runtime_info); + InterpCopyJitInfoFuncUserData copy_jit_info_data; + // Can't keep memory manager lock while iterating and calling callback since it might take other locks + // causing poential deadlock situations. Instead, create copy of interpreter imethod jinfo pointers into + // plain array and use pointers from array when when running callbacks. + copy_jit_info_data.size = mono_atomic_load_i32 (&(jit_mm->interp_code_hash.num_entries)); + copy_jit_info_data.next = 0; + copy_jit_info_data.jit_info_array = (MonoJitInfo**) g_new (MonoJitInfo*, copy_jit_info_data.size); + if (copy_jit_info_data.jit_info_array) { + jit_mm_lock (jit_mm); + mono_internal_hash_table_apply (&jit_mm->interp_code_hash, interp_copy_jit_info_func, ©_jit_info_data); + jit_mm_unlock (jit_mm); + } + + if (copy_jit_info_data.jit_info_array) { + for (int i = 0; i < copy_jit_info_data.next; ++i) + func (copy_jit_info_data.jit_info_array [i], user_data); + g_free (copy_jit_info_data.jit_info_array); + } + } + + g_ptr_array_free (alcs, TRUE); + } } static gboolean From 0d63ccf3f880bc6950842aa67376545ed39c1228 Mon Sep 17 00:00:00 2001 From: "D.S. Qiu" Date: Tue, 4 Apr 2023 04:52:11 +0800 Subject: [PATCH 13/13] fix --- src/mono/mono/mini/interp/interp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mono/mono/mini/interp/interp.c b/src/mono/mono/mini/interp/interp.c index 5f056c9c3bd4b5..e368f2e4b397e8 100644 --- a/src/mono/mono/mini/interp/interp.c +++ b/src/mono/mono/mini/interp/interp.c @@ -8661,8 +8661,8 @@ interp_jit_info_foreach (InterpJitInfoFunc func, gpointer user_data) } if (copy_jit_info_data.jit_info_array) { - for (int i = 0; i < copy_jit_info_data.next; ++i) - func (copy_jit_info_data.jit_info_array [i], user_data); + for (int j = 0; j < copy_jit_info_data.next; ++j) + func (copy_jit_info_data.jit_info_array [j], user_data); g_free (copy_jit_info_data.jit_info_array); } }