[Mono-dev] mono_thread_attach/mono_thread_detach not threadsafe?

Allan Hsu allan at counterpop.net
Tue Jan 31 00:36:39 EST 2006


One thing I forgot to mention:

This code will not print the warning on OS X or segfault on Linux if  
you run it with GC_DONT_GC=1.

	-Allan
--
Allan Hsu <allan at counterpop dot net>
1E64 E20F 34D9 CBA7 1300  1457 AC37 CBBB 0E92 C779


On Jan 30, 2006, at 7:44 PM, Allan Hsu wrote:

> Lately, we've been seeing a lot of messages in the imeem OS X  
> client that look like this:
>
> ** (process:23127): WARNING **: _wapi_handle_unref: Attempting to  
> unref unused handle 0x7cf
>
> These messages eventually lead to messages of this form:
>
> ** (process:23127): WARNING **: _wapi_thread_apc_pending: error  
> looking up thread handle 0x2c8
>
> I've tracked down these messages to our use of mono_thread_attach  
> and mono_thread_detach; I've isolated the messages down to a small  
> bit of C that mimics the Dumbarton NSThread poser (minus the  
> Objective-C code):
>
> http://www.blargle.com/~allan/racy.tar.bz2
>
> Is this proper usage of mono_thread_attach/mono_thread_detach? The  
> results that follow seem to suggest that I'm either using these two  
> functions incorrectly, or these functions are not threadsafe and  
> the code in the tarball is exposing some sort of race condition.
>
> The code:
>
> The code simply initializes the JIT and then creates 64 threads  
> that call mono_thread_attach, then mono_thread_detach, then joins  
> each thread and repeats the process indefinitely.
>
> Under Mono 1.1.13.2 on OS X 10.4.4, the sample code eventually  
> generates a lot of _wapi_handle_unref g_log calls that originate  
> from CloseHandle called from the finalizer thread:
>
> #0  0x006e8688 in g_log ()
> #1  0x00317130 in _wapi_handle_unref (handle=0x2863) at handles.c:827
> #2  0x00317c18 in CloseHandle (handle=0x2863) at handles.c:1040
> #3  0x00309d74 in  
> ves_icall_System_Threading_Thread_Thread_free_internal (this=0x0,  
> thread=0x10) at threads.c:555
> #4  0x00064c58 in ?? ()
> #5  0x00064968 in ?? ()
> #6  0x0006458c in ?? ()
> #7  0x0022f334 in mono_jit_runtime_invoke (method=0x111c6c0,  
> obj=0xe4870, params=0x0, exc=0xf0103c90) at mini.c:9863
> #8  0x002e5b9c in mono_runtime_invoke (method=0x0, obj=0x10,  
> params=0x382300, exc=0x3822ec) at object.c:1346
> #9  0x002b446c in run_finalize (obj=0xe4870, data=0x0) at gc.c:102
> #10 0x00343920 in GC_invoke_finalizers ()
> #11 0x002b5300 in finalizer_thread (unused=0x0) at gc.c:778
> #12 0x003097c8 in start_wrapper (data=0x0) at threads.c:305
> #13 0x0032a360 in timed_thread_start_routine (args=0x1120a40) at  
> timed-thread.c:134
> #14 0x9002b200 in _pthread_body ()
>
> Sometimes (though rarely), this code will cause Mono on OS X to  
> segfault. This will happen more often if you increase  
> CHUNK_THREADCOUNT to 200 or more.
>
> Under Mono 1.1.13.2  on (32-bit) Linux 2.6.9, the sample code  
> almost immediately dies with a segfault; Mono catches the segfault  
> roughly half the time. Here is a backtrace:
>
> 0x00d1c890 in pthread_kill () from /lib/tls/libpthread.so.0
> (gdb) bt
> #0  0x00d1c890 in pthread_kill () from /lib/tls/libpthread.so.0
> #1  0x0025bb05 in GC_suspend_all () from /usr/lib/libmono.so.0
> #2  0x0025bb49 in GC_suspend_all () from /usr/lib/libmono.so.0
> #3  0x0025bcf7 in GC_stop_world () from /usr/lib/libmono.so.0
> #4  0x0024b731 in GC_stopped_mark () from /usr/lib/libmono.so.0
> #5  0x0024b3b4 in GC_try_to_collect_inner () from /usr/lib/ 
> libmono.so.0
> #6  0x0024c4f3 in GC_collect_or_expand () from /usr/lib/libmono.so.0
> #7  0x0024c736 in GC_allocobj () from /usr/lib/libmono.so.0
> #8  0x00250ed1 in GC_generic_malloc_inner () from /usr/lib/ 
> libmono.so.0
> #9  0x00250ff1 in GC_generic_malloc () from /usr/lib/libmono.so.0
> #10 0x002512dd in GC_malloc () from /usr/lib/libmono.so.0
> #11 0x001da3df in mono_gc_alloc_fixed () from /usr/lib/libmono.so.0
> #12 0x001f3385 in mono_thread_get_pending_exception ()
>    from /usr/lib/libmono.so.0
> #13 0x001f3531 in mono_thread_get_pending_exception ()
>    from /usr/lib/libmono.so.0
> #14 0x001f0718 in mono_thread_attach () from /usr/lib/libmono.so.0
> #15 0x080487f1 in thread_function ()
> #16 0x00d19341 in start_thread () from /lib/tls/libpthread.so.0
> #17 0x00c846fe in clone () from /lib/tls/libc.so.6
>
> 	-Allan
> --
> Allan Hsu <allan at counterpop dot net>
> 1E64 E20F 34D9 CBA7 1300  1457 AC37 CBBB 0E92 C779
>
>
> _______________________________________________
> Mono-devel-list mailing list
> Mono-devel-list at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-devel-list




More information about the Mono-devel-list mailing list