[Mono-dev] Jump trampoline threading problem with synchronized methods
kumpera at gmail.com
Mon May 30 10:50:31 EDT 2011
The fix is to actually disable jmp to synchronized methods and use a regular
On Mon, May 30, 2011 at 11:46 AM, Martin Däumler <mdae at cs.tu-chemnitz.de>wrote:
> maybe there might be a problem with a optimization in the jump
> trampoline code. In the IL code example appended, the main method
> creates two threads that start with a method that jumps to a
> synchronized method. The final value of the variable "count"
> should be 20, but it isn't always so. If you change the jump
> instruction to call instruction, the code works as expected. I
> tested with Mono 2.6.1, 2.6.7 and 2.10.2 on an x86 machine
> running Linux.
> In "mono_postprocess_patches()", the handle to the method is stored
> in the hash table "jump_target_hash". When the synchronized method
> ("tolleMethode()") is jumped to the first time, the magic trampoline
> creates a wrapper and returns the address of the wrapper. The first
> jump instruction is patched with that address. A later lookup in the
> "jump_target_hash" ("mono_jit_compile_method_inner()", in the scope
> of the JIT-compilation of the wrapper) doesn't return pending jump
> patches because the method handle of "tolleMethod()" is stored,
> instead of the wrapper's handle. So, the second jump instruction
> is not patched (if it is JIT-compiled so far).
> Even worse: When the wrapper is executed, the method "tolleMethode()"
> is JIT-compiled. Then, in "mono_jit_compile_method_inner()", there
> is a hash hit and the second jump instruction is patched with
> the method's address instead of her wrapper's one. So, I suggest to
> check for a synchronized method in "mono_postprocess_patches()",
> to create a wrapper if needed and to change the patch's target
> method to the wrapper. There might be other problems I don't see?
> With kind regards,
> Martin Däumler
> Mono-devel-list mailing list
> Mono-devel-list at lists.ximian.com
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the Mono-devel-list