diff options
author | Vlad Brezae <brezaevlad@gmail.com> | 2021-09-30 15:42:06 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-09-30 15:42:06 +0300 |
commit | 4150e65c9e3fb6a63afe6ac7f6ad9e90a7df971b (patch) | |
tree | f40a7b2d710694f7fd6892948cb6a1daa3283bbb | |
parent | 5a21247f3669777823babd1c75bc199c32aa7484 (diff) |
[aot] Don't leak unbox trampolines (#21225)
-rw-r--r-- | mono/mini/aot-runtime.c | 26 |
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); } |