<div dir="ltr">Hi everyone.<div><br></div><div>It seems there's a small problem with the way the runtime shuts down at the moment: the thread pool (and apparently other resources) are shut down before the ProcessExit signal is fired. This is the cause for the NLog bug described here[1], since NLog relies on the threadpool being available in ProcessExit (works on Microsoft but not mono). To my mind this is a bug, although oddly enough there's a runtime test[2] that appears to imply that it may be normal?</div>
<div><br></div><div>I've submitted this pull request[3] on github which has a test[4] that reproduces the problem, and a proposed patch which is probably insufficient since my first time in the runtime. The general idea is this:</div>
<div><br></div><div>* mono_runtime_shutdown(), which runs the ProcessExit event code is executed from mini_cleanup(), which is a pretty late step (after we shutdown the pool and other resources in thread_manage()).</div><div>
* The same thing happens in System_Environment_Exit(), which again shuts down the thread pool before calling mono_runtime_quit() (which eventually triggers the mono_runtime_shutdown()).</div><div>* My working patch moves mono_runtime_shutdown() and mono_domain_finalizers() out of mini_cleanup() and into thread_manage() and System_Environment_Exit(), right before we shut down the thread pool and other stuff.</div>
<div><br></div><div>Somebody who actually understands everything in there should take a look at this... For one thing, the according to the comment in mini.c, mono_domain_finalize() also seems like it should be called earlier, but going so (next to mono_runtime_shutdown) triggered a segmentation fault for me.</div>
<div><br></div><div>Also, my patch duplicates code the two function calls, although other calls are already duplicated. It seems that a small cleanup/refactor could help eliminate this duplication, both across thread_manage() and System_Environment_Exit() and across mini and the interpreter (which doesn't trigger the ProcessExit event?) I'd be glad to go deeper into this if people think it's good/necessary.</div>
<div><br></div><div>Shay</div><div><br></div><div>[1] <a href="http://nlog-project.org/2011/10/30/using-nlog-with-mono.html">http://nlog-project.org/2011/10/30/using-nlog-with-mono.html</a></div><div>[2] <a href="https://github.com/mono/mono/blob/master/mono/tests/bug-438454.cs">https://github.com/mono/mono/blob/master/mono/tests/bug-438454.cs</a></div>
<div>[3] <a href="https://github.com/mono/mono/pull/505">https://github.com/mono/mono/pull/505</a></div><div>[4] <a href="https://github.com/roji/mono/commit/a2e54923bbd578e3fc8bdd95188b017648120de7">https://github.com/roji/mono/commit/a2e54923bbd578e3fc8bdd95188b017648120de7</a></div>
</div>