https://issues.dlang.org/show_bug.cgi?id=20430
kinke <[email protected]> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |[email protected] --- Comment #2 from kinke <[email protected]> --- Can reproduce; there's one less thread_detach than _attach. Output with my quad-core: > program.exe DLL_PROCESS_ATTACH End... DLL_THREAD_ATTACH DLL_THREAD_ATTACH DLL_THREAD_ATTACH DLL_THREAD_ATTACH DLL_THREAD_DETACH DLL_THREAD_DETACH DLL_THREAD_DETACH DLL_PROCESS_DETACH > program.exe --DRT-gcopt=parallel:0 Start loading. Start Dynamic Link... DLL_PROCESS_ATTACH End... DLL_THREAD_ATTACH DLL_THREAD_ATTACH DLL_THREAD_ATTACH DLL_THREAD_ATTACH DLL_PROCESS_DETACH > program.exe --DRT-gcopt=disable:1 Start loading. Start Dynamic Link... DLL_PROCESS_ATTACH End... DLL_THREAD_ATTACH DLL_THREAD_ATTACH DLL_THREAD_ATTACH DLL_THREAD_ATTACH DLL_THREAD_ATTACH DLL_THREAD_ATTACH DLL_THREAD_ATTACH DLL_THREAD_DETACH DLL_THREAD_DETACH DLL_THREAD_DETACH DLL_PROCESS_DETACH The output is the same but the program doesn't hang anymore when using a more complete DllMain (extended core.sys.windows.dll.SimpleDllMain mixin): extern (Windows) BOOL DllMain(HINSTANCE hInstance, uint ulReason, void* reserved) { import core.sys.windows.winnt; import core.sys.windows.dll : dll_process_attach, dll_process_detach, dll_thread_attach, dll_thread_detach; switch (ulReason) { default: assert(0); case DLL_PROCESS_ATTACH: printf("DLL_PROCESS_ATTACH\n"); return dll_process_attach( hInstance, true ); case DLL_PROCESS_DETACH: printf("DLL_PROCESS_DETACH\n"); dll_process_detach( hInstance, true ); return true; case DLL_THREAD_ATTACH: printf("DLL_THREAD_ATTACH\n"); return dll_thread_attach( true, true ); case DLL_THREAD_DETACH: printf("DLL_THREAD_DETACH\n"); return dll_thread_detach( true, true ); } } --
