We shouldn't try to initialize classes with the compilation_unit mutex held. The right fix here is to split initialization from fix-up, and do the initialization before we even try to compile the method.
Reported-by: Tomek Grabiec <tgrab...@gmail.com> Signed-off-by: Vegard Nossum <vegard.nos...@gmail.com> --- arch/x86/emit-code.c | 14 +++++++------- include/vm/static.h | 2 +- jit/trampoline.c | 6 ++++++ 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/arch/x86/emit-code.c b/arch/x86/emit-code.c index 0debd5a..ffa491d 100644 --- a/arch/x86/emit-code.c +++ b/arch/x86/emit-code.c @@ -416,13 +416,10 @@ static void fixup_vtable(struct compilation_unit *cu, vmc->vtable.native_ptr[cu->method->virtual_index] = target; } -int fixup_static(struct vm_class *vmc) +void fixup_static(struct vm_class *vmc) { struct static_fixup_site *this, *next; - if (vm_class_ensure_init(vmc)) - return -1; - list_for_each_entry_safe(this, next, &vmc->static_fixup_site_list, vmc_node) { @@ -437,8 +434,6 @@ int fixup_static(struct vm_class *vmc) list_del(&this->cu_node); free(this); } - - return 0; } int fixup_static_at(unsigned long addr) @@ -455,7 +450,12 @@ int fixup_static_at(unsigned long addr) + this->insn->mach_offset; if ((unsigned long) site_addr == addr) { - return fixup_static(this->vmf->class); + int ret = vm_class_ensure_init(this->vmf->class); + if (ret) + return ret; + + fixup_static(this->vmf->class); + return 0; } } diff --git a/include/vm/static.h b/include/vm/static.h index e7e6104..6e434e0 100644 --- a/include/vm/static.h +++ b/include/vm/static.h @@ -28,7 +28,7 @@ int add_getstatic_fixup_site(struct insn *insn, int add_putstatic_fixup_site(struct insn *insn, struct vm_field *vmf, struct compilation_unit *cu); -int fixup_static(struct vm_class *vmc); +void fixup_static(struct vm_class *vmc); int fixup_static_at(unsigned long addr); extern unsigned long static_field_signal_bh(unsigned long ret); diff --git a/jit/trampoline.c b/jit/trampoline.c index dd9658a..40f3211 100644 --- a/jit/trampoline.c +++ b/jit/trampoline.c @@ -103,6 +103,12 @@ void *jit_magic_trampoline(struct compilation_unit *cu) struct vm_method *method = cu->method; void *ret; + if (vm_method_is_static(method)) { + /* This is for "invokestatic"... */ + if (vm_class_ensure_init(method->class)) + return NULL; + } + if (opt_trace_magic_trampoline) trace_magic_trampoline(cu); -- 1.6.0.4 ------------------------------------------------------------------------------ Enter the BlackBerry Developer Challenge This is your chance to win up to $100,000 in prizes! For a limited time, vendors submitting new applications to BlackBerry App World(TM) will have the opportunity to enter the BlackBerry Developer Challenge. See full prize details at: http://p.sf.net/sfu/blackberry _______________________________________________ Jatovm-devel mailing list Jatovm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jatovm-devel