The fix is to actually disable jmp to synchronized methods and use a regular call.<div><br><br><div class="gmail_quote">On Mon, May 30, 2011 at 11:46 AM, Martin Däumler <span dir="ltr">&lt;<a href="mailto:mdae@cs.tu-chemnitz.de">mdae@cs.tu-chemnitz.de</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Hello,<br>
<br>
maybe there might be a problem with a optimization in the jump<br>
trampoline code. In the IL code example appended, the main method<br>
creates two threads that start with a method that jumps to a<br>
synchronized method. The final value of the variable &quot;count&quot;<br>
should be 20, but it isn&#39;t always so. If you change the jump<br>
instruction to call instruction, the code works as expected. I<br>
tested with Mono 2.6.1, 2.6.7 and 2.10.2 on an x86 machine<br>
running Linux.<br>
<br>
In &quot;mono_postprocess_patches()&quot;, the handle to the method is stored<br>
in the hash table &quot;jump_target_hash&quot;. When the synchronized method<br>
(&quot;tolleMethode()&quot;) is jumped to the first time, the magic trampoline<br>
creates a wrapper and returns the address of the wrapper. The first<br>
jump instruction is patched with that address. A later lookup in the<br>
&quot;jump_target_hash&quot; (&quot;mono_jit_compile_method_inner()&quot;, in the scope<br>
of the JIT-compilation of the wrapper) doesn&#39;t return pending jump<br>
patches because the method handle of &quot;tolleMethod()&quot; is stored,<br>
instead of the wrapper&#39;s handle. So, the second jump instruction<br>
is not patched (if it is JIT-compiled so far).<br>
<br>
Even worse: When the wrapper is executed, the method &quot;tolleMethode()&quot;<br>
is JIT-compiled. Then, in &quot;mono_jit_compile_method_inner()&quot;, there<br>
is a hash hit and the second jump instruction is patched with<br>
the method&#39;s address instead of her wrapper&#39;s one. So, I suggest to<br>
check for a synchronized method in &quot;mono_postprocess_patches()&quot;,<br>
to create a wrapper if needed and to change the patch&#39;s target<br>
method to the wrapper. There might be other problems I don&#39;t see?<br>
<br>
<br>
With kind regards,<br><font color="#888888">
Martin Däumler<br>
</font><br>_______________________________________________<br>
Mono-devel-list mailing list<br>
<a href="mailto:Mono-devel-list@lists.ximian.com">Mono-devel-list@lists.ximian.com</a><br>
<a href="http://lists.ximian.com/mailman/listinfo/mono-devel-list" target="_blank">http://lists.ximian.com/mailman/listinfo/mono-devel-list</a><br>
<br></blockquote></div><br></div>