Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVlad Brezae <brezaevlad@gmail.com>2021-09-30 15:42:06 +0300
committerGitHub <noreply@github.com>2021-09-30 15:42:06 +0300
commit4150e65c9e3fb6a63afe6ac7f6ad9e90a7df971b (patch)
treef40a7b2d710694f7fd6892948cb6a1daa3283bbb
parent5a21247f3669777823babd1c75bc199c32aa7484 (diff)
[aot] Don't leak unbox trampolines (#21225)
-rw-r--r--mono/mini/aot-runtime.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/mono/mini/aot-runtime.c b/mono/mini/aot-runtime.c
index 5e6fc012428..3da929f4d2e 100644
--- a/mono/mini/aot-runtime.c
+++ b/mono/mini/aot-runtime.c
@@ -140,6 +140,8 @@ struct MonoAotModule {
guint32 *unbox_trampolines_end;
guint32 *unbox_trampoline_addresses;
guint8 *unwind_info;
+ /* Maps method index -> unbox tramp */
+ gpointer *unbox_tramp_per_method;
/* Points to the mono EH data created by LLVM */
guint8 *mono_eh_frame;
@@ -5978,6 +5980,17 @@ mono_aot_get_unbox_trampoline (MonoMethod *method, gpointer addr)
return mono_aot_get_unbox_arbitrary_trampoline (addr);
}
+ if (!amodule->unbox_tramp_per_method) {
+ gpointer arr = g_new0 (gpointer, amodule->info.nmethods);
+ mono_memory_barrier ();
+ gpointer old_arr = mono_atomic_cas_ptr ((volatile gpointer*)&amodule->unbox_tramp_per_method, arr, NULL);
+ if (old_arr)
+ g_free (arr);
+
+ }
+ if (amodule->unbox_tramp_per_method [method_index])
+ return amodule->unbox_tramp_per_method [method_index];
+
if (amodule->info.llvm_unbox_tramp_indexes) {
int unbox_tramp_idx;
@@ -5996,6 +6009,10 @@ mono_aot_get_unbox_trampoline (MonoMethod *method, gpointer addr)
g_assert (unbox_tramp_idx < amodule->info.llvm_unbox_tramp_num);
code = ((gpointer*)(amodule->info.llvm_unbox_trampolines))[unbox_tramp_idx];
g_assert (code);
+
+ mono_memory_barrier ();
+ amodule->unbox_tramp_per_method [method_index] = code;
+
return code;
}
@@ -6003,8 +6020,12 @@ mono_aot_get_unbox_trampoline (MonoMethod *method, gpointer addr)
gpointer (*get_tramp) (int) = (gpointer (*)(int))amodule->info.llvm_get_unbox_tramp;
code = get_tramp (method_index);
- if (code)
+ if (code) {
+ mono_memory_barrier ();
+ amodule->unbox_tramp_per_method [method_index] = code;
+
return code;
+ }
}
ut = amodule->unbox_trampolines;
@@ -6040,6 +6061,9 @@ mono_aot_get_unbox_trampoline (MonoMethod *method, gpointer addr)
tinfo->code_size = *(guint32*)symbol_addr;
mono_aot_tramp_info_register (tinfo, NULL);
+ mono_memory_barrier ();
+ amodule->unbox_tramp_per_method [method_index] = code;
+
/* The caller expects an ftnptr */
return mono_create_ftnptr (mono_domain_get (), code);
}