<div dir="ltr">It could be a bug, but I think it is by design as a performance optimization to avoid setting up and cleaning up every time a call to managed code it made by a native thread.<div><br></div><div>- Jonathan<br>
<div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Dec 13, 2013 at 4:14 PM, Bassam Tabbara <span dir="ltr"><<a href="mailto:bassam@symform.com" target="_blank">bassam@symform.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">



<div style="word-wrap:break-word">
Jonathan, thanks for the info.†
<div><br>
</div>
<div>The native thread (#4) does not know about mono nor is it linked with the mono libraries, it would be hard to call mono_thread_detach from it. Is there a different solution to this?
<div><br>
</div>
<div>Out of curiosity why does mono not detach a thread once a managed call is complete from a native thread.
<div><div class="h5"><div><br>
<div>
<div>On Dec 13, 2013, at 12:55 PM, Jonathan Chambers <<a href="mailto:joncham@gmail.com" target="_blank">joncham@gmail.com</a>> wrote:</div>
<br>
<blockquote type="cite">
<div dir="ltr">If the native thread calls into managed code it is automatically 'attached' to the mono runtime and the gc for tracking. It does not automatically unattached upon return of the call into managed code. Then at shutdown the native thread is part
 of the list of threads that are expected to exit before the runtime can shut down properly.
<div><br>
</div>
<div>Try to call mono_thread_detach() in thread #4 before entering the wait for shutdown.<br>
<div><br>
</div>
<div>- Jonathan</div>
<div class="gmail_extra"><br>
<br>
<div class="gmail_quote">On Fri, Dec 13, 2013 at 1:09 PM, Bassam Tabbara <span dir="ltr">
<<a href="mailto:bassam@symform.com" target="_blank">bassam@symform.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hello,<br>
<br>
Iím seeing a deadlock on shutdown of latest mono form master when using our own native background thread. Here are backtraces:<br>
<br>
* thread #1: tid = 0xd83c3, 0x00007fff91412716 libsystem_kernel.dylib`__psynch_cvwait + 10, queue = 'com.apple.main-thread, stop reason = signal SIGSTOP<br>
† † frame #0: 0x00007fff91412716 libsystem_kernel.dylib`__psynch_cvwait + 10<br>
† † frame #1: 0x00007fff86b20c3b libsystem_pthread.dylib`_pthread_cond_wait + 727<br>
† † frame #2: 0x000000010919a892 mono`_wapi_handle_timedwait_signal_handle(handle=<unavailable>, timeout=<unavailable>, alertable=1, poll=<unavailable>) + 514 at handles.c:1588<br>
† † frame #3: 0x00000001091ab95b mono`WaitForMultipleObjectsEx(numobjects=7, handles=0x00007fff56c6f2f0, waitall=1, timeout=4294967295, alertable=1) + 1419 at wait.c:668<br>
† † frame #4: 0x0000000109112a2f mono`wait_for_tids(wait=0x00007fff56c6f2f0, timeout=<unavailable>) + 47 at threads.c:2809<br>
† † frame #5: 0x0000000109112626 mono`mono_thread_manage + 694 at threads.c:3095<br>
† † frame #6: 0x0000000108ffc9fd mono`mono_main(argc=11, argv=<unavailable>) + 6301 at driver.c:2015<br>
† † frame #7: 0x0000000108f92a0c mono`main [inlined] mono_main_with_options(argv=<unavailable>, argc=<unavailable>) + 549 at main.c:98<br>
† † frame #8: 0x0000000108f927e7 mono`main(argc=<unavailable>, argv=<unavailable>) + 39 at main.c:133<br>
† † frame #9: 0x00007fff8d7875fd libdyld.dylib`start + 1<br>
<br>
† thread #2: tid = 0xd83c5, 0x00007fff9140ea56 libsystem_kernel.dylib`semaphore_wait_trap + 10<br>
† † frame #0: 0x00007fff9140ea56 libsystem_kernel.dylib`semaphore_wait_trap + 10<br>
† † frame #1: 0x00000001091b8d38 mono`mono_sem_wait(sem=0x000000010930ad78, alertable=<unavailable>) + 24 at mono-semaphore.c:121<br>
† † frame #2: 0x0000000109136017 mono`finalizer_thread(unused=<unavailable>) + 103 at gc.c:1073<br>
† † frame #3: 0x000000010910d743 mono`start_wrapper [inlined] start_wrapper_internal + 456 at threads.c:609<br>
† † frame #4: 0x000000010910d57b mono`start_wrapper(data=<unavailable>) + 43 at threads.c:654<br>
† † frame #5: 0x00000001091acd50 mono`thread_start_routine(args=0x00007f930981cbf8) + 144 at wthreads.c:294<br>
† † frame #6: 0x00000001091bdffa mono`inner_start_thread(arg=<unavailable>) + 58 at mono-threads-posix.c:49<br>
† † frame #7: 0x00007fff86b1e899 libsystem_pthread.dylib`_pthread_body + 138<br>
† † frame #8: 0x00007fff86b1e72a libsystem_pthread.dylib`_pthread_start + 137<br>
† † frame #9: 0x00007fff86b22fc9 libsystem_pthread.dylib`thread_start + 13<br>
<br>
† thread #3: tid = 0xd83c9, 0x00007fff91413662 libsystem_kernel.dylib`kevent64 + 10, queue = 'com.apple.libdispatch-manager<br>
† † frame #0: 0x00007fff91413662 libsystem_kernel.dylib`kevent64 + 10<br>
† † frame #1: 0x00007fff8e0ac43d libdispatch.dylib`_dispatch_mgr_invoke + 239<br>
† † frame #2: 0x00007fff8e0ac152 libdispatch.dylib`_dispatch_mgr_thread + 52<br>
<br>
† thread #4: tid = 0xda1fc, 0x00007fff9141364a libsystem_kernel.dylib`kevent + 10<br>
† † frame #0: 0x00007fff9141364a libsystem_kernel.dylib`kevent + 10<br>
† † frame #1: 0x000000010fa22712 libsymformutp.dylib`kq_dispatch(base=0x00007f930b564890, tv=<unavailable>) + 706 at kqueue.c:301<br>
† † frame #2: 0x000000010fa17429 libsymformutp.dylib`event_base_loop(base=0x00007f930b564890, flags=<unavailable>) + 873 at event.c:1826<br>
† † frame #3: 0x000000010f9fe657 libsymformutp.dylib`UTPEvents::Run(e=0x00007f930b566180) + 23 at utp_event.cpp:81<br>
† † frame #4: 0x00007fff86b1e899 libsystem_pthread.dylib`_pthread_body + 138<br>
† † frame #5: 0x00007fff86b1e72a libsystem_pthread.dylib`_pthread_start + 137<br>
† † frame #6: 0x00007fff86b22fc9 libsystem_pthread.dylib`thread_start + 13<br>
<br>
thread #4 is out native thread that will be shutdown when a managed SafeHandle is released. This thread is likely to have called managed code at some point. thread #1 seems to be waiting on all threads to exit including thread #4, but until finalization is
 complete on thread #2 this is not going to happen, and hence the deadlock.<br>
<br>
Does this seem likely? Why does mono runtime wait for threads to exit that it did not create? Should finalization happen before waiting for all threads to exit?<br>
<br>
Thanks in advance for the help.<br>
Bassam<br>
_______________________________________________<br>
Mono-devel-list mailing list<br>
<a href="mailto:Mono-devel-list@lists.ximian.com" target="_blank">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>
</blockquote>
</div>
<br>
</div>
</div>
</div>
</blockquote>
</div>
<br>
</div>
</div></div></div>
</div>
</div>

</blockquote></div><br></div></div></div>