[Mono-dev] System.Threading.Monitor::Exit fails in latest trees

Martin Daeumler mdae at cs.tu-chemnitz.de
Fri Apr 29 09:39:54 EDT 2011

On March 10, 2010, Paolo Molaro wrote:

>> Further, I traced it down into the mono 2.6.1 code tree, and
>> mono_monitor_exit is never called. The trampoline generates the code, but
>> it's never called. Can you provide a quick fix? It seems like a glaring
>> bug.

>There is no bug, on your architecture the fast path is optimized and it
>won't go to the unmanaged function in the runtime.


how does this fast path work on x86 and Mono 2.6.1? During JITing this code:

class Test {
	int test1;
	public int callInst(Test myClass) {
		lock (this) {
			myClass.test1 = 1;
		return myClass.test1;
	static int Main() {
		Test meineKlasse = new Test();		
		int ret = meineKlasse.callInst(meineKlasse);		
		Console.WriteLine("meineKlasse: " + ret.ToString());
		return 0;

, "mono_monitor_get_fast_enter_method()" and
are not called. While executing the method "callInst()" the unmanaged
"mono_monitor_enter()" (mono/metadata/monitor.c) is called through a generic

Q1: The generic (monitor) trampoline is not called directly by the code of
There is a kind of wrapper that calls the generic trampoline. Where is the

When leaving the lock-block, i.e., calling
"System.Threading.Monitor::Exit()" from within
the finally-block in den CIL-code, the unmanaged function
(mono/metadata/monitor.c) is not called at all. There is an ominous piece of
code that
returns to "callInst()".

Q2: How is the monitor exit fast path realized? Where is the "wrapper"
which does not call "mono_monitor_exit()"?

With kind regards,
Martin Däumler

View this message in context: http://mono.1490590.n4.nabble.com/System-Threading-Monitor-Exit-fails-in-latest-trees-tp1578116p3483712.html
Sent from the Mono - Dev mailing list archive at Nabble.com.

More information about the Mono-devel-list mailing list