[Issue 15976] New: explicite TLS initializes badly in DLLs if other threads exist
via Digitalmars-d-bugs
digitalmars-d-bugs at puremagic.com
Sun May 1 02:32:51 PDT 2016
https://issues.dlang.org/show_bug.cgi?id=15976
Issue ID: 15976
Summary: explicite TLS initializes badly in DLLs if other
threads exist
Product: D
Version: D2
Hardware: x86_64
OS: Windows
Status: NEW
Severity: enhancement
Priority: P1
Component: druntime
Assignee: nobody at puremagic.com
Reporter: r.sagitario at gmx.de
This happened for intermediate versions of druntime that used explicite TLS to
save the thread pointer:
This is the DLL code:
/////////////////////////////////////////////
module exptls;
import core.sys.windows.windows;
import core.sys.windows.dll;
import core.stdc.stdio;
mixin SimpleDllMain;
__gshared DWORD tlsSlot;
int tlsVar;
shared static this()
{
tlsSlot = TlsAlloc();
printf("TlsAlloc() = %d\n", tlsSlot);
}
static this()
{
printf("TlsSetValue(%d, &var = %p\n", tlsSlot, &tlsVar);
TlsSetValue(tlsSlot, &tlsVar);
}
And the executable:
////////////////////////////////////////////////////
module main;
import core.sys.windows.windows;
import core.thread;
import core.time;
alias fnType = void function();
__gshared fnType pFn;
void test()
{
Thread.sleep(2.seconds);
assert(pFn);
pFn();
}
void main()
{
Thread t1 = new Thread(&test);
t1.start();
Thread.sleep(1.seconds);
HANDLE h = LoadLibrary("exptls.dll");
pFn = cast(fnType) GetProcAddress(h, "verifyTls");
assert(pFn);
pFn();
t1.join();
}
extern(C)
export void verifyTls()
{
printf("TlsGetValue() = %x, &var = %x\n", TlsGetValue(tlsSlot), &tlsVar);
assert(TlsGetValue(tlsSlot) == &tlsVar);
}
Compile with:
dmd -ofexptls.dll exptls.d -m64 -L/DLL
dmd main.d -m64
Running produces output similar to:
TlsAlloc() = 26
TlsSetValue(26, &var = 0000005FF88E3B50
TlsSetValue(26, &var = 0000005FF88F36B0
TlsGetValue() = f88f36b0, &var = f88e3b50
and the process crashes (due to the assert exception from DLL not being
handled).
--
More information about the Digitalmars-d-bugs
mailing list