Hi,<div><br></div><div>  Those trampolines are in tramp-&lt;ARCH&gt;.c, they are called monitor_enter/exit_trampoline ().</div><div><br></div><div>    Zoltan<br><br><div class="gmail_quote">On Fri, Apr 29, 2011 at 3:39 PM, Martin Daeumler <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;"><div class="im">On March 10, 2010, Paolo Molaro wrote:<br>
<br>
&gt;&gt; Further, I traced it down into the mono 2.6.1 code tree, and<br>
&gt;&gt; mono_monitor_exit is never called. The trampoline generates the code, but<br>
&gt;&gt; it&#39;s never called. Can you provide a quick fix? It seems like a glaring<br>
&gt;&gt; bug.<br>
<br>
&gt;There is no bug, on your architecture the fast path is optimized and it<br>
&gt;won&#39;t go to the unmanaged function in the runtime.<br>
<br>
</div>Hello,<br>
<br>
how does this fast path work on x86 and Mono 2.6.1? During JITing this code:<br>
<br>
class Test {<br>
        int test1;<br>
<br>
        public int callInst(Test myClass) {<br>
                lock (this) {<br>
                        myClass.test1 = 1;<br>
                }<br>
                return myClass.test1;<br>
        }<br>
<br>
        static int Main() {<br>
                Test meineKlasse = new Test();<br>
                int ret = meineKlasse.callInst(meineKlasse);<br>
                Console.WriteLine(&quot;meineKlasse: &quot; + ret.ToString());<br>
                return 0;<br>
        }<br>
}<br>
<br>
, &quot;mono_monitor_get_fast_enter_method()&quot; and<br>
&quot;mono_monitor_get_fast_exit_method()&quot;<br>
are not called. While executing the method &quot;callInst()&quot; the unmanaged<br>
function<br>
&quot;mono_monitor_enter()&quot; (mono/metadata/monitor.c) is called through a generic<br>
trampoline.<br>
<br>
Q1: The generic (monitor) trampoline is not called directly by the code of<br>
&quot;callInst()&quot;.<br>
There is a kind of wrapper that calls the generic trampoline. Where is the<br>
wrapper<br>
generated?<br>
<br>
When leaving the lock-block, i.e., calling<br>
&quot;System.Threading.Monitor::Exit()&quot; from within<br>
the finally-block in den CIL-code, the unmanaged function<br>
&quot;mono_monitor_exit()&quot;<br>
(mono/metadata/monitor.c) is not called at all. There is an ominous piece of<br>
code that<br>
returns to &quot;callInst()&quot;.<br>
<br>
Q2: How is the monitor exit fast path realized? Where is the &quot;wrapper&quot;<br>
generated<br>
which does not call &quot;mono_monitor_exit()&quot;?<br>
<br>
<br>
With kind regards,<br>
Martin Däumler<br>
<font color="#888888"><br>
--<br>
View this message in context: <a href="http://mono.1490590.n4.nabble.com/System-Threading-Monitor-Exit-fails-in-latest-trees-tp1578116p3483712.html" target="_blank">http://mono.1490590.n4.nabble.com/System-Threading-Monitor-Exit-fails-in-latest-trees-tp1578116p3483712.html</a><br>

</font><div class="im">Sent from the Mono - Dev mailing list archive at Nabble.com.<br>
_______________________________________________<br>
</div><div><div></div><div class="h5">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>
</div></div></blockquote></div><br></div>