[Issue 20430] [Regression 2.089.0] DLL Runtime.terminate() hangs

d-bugmail at puremagic.com d-bugmail at puremagic.com
Fri Dec 6 17:10:23 UTC 2019


https://issues.dlang.org/show_bug.cgi?id=20430

kinke <kinke at gmx.net> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |kinke at gmx.net

--- Comment #2 from kinke <kinke at gmx.net> ---
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 );
    }
}

--


More information about the Digitalmars-d-bugs mailing list