Hi, everyone.
I have a thread running in Dll. But it always halts because of
access violation exception when GC begins collecting.
This is the thread stack frame in vs2013.
testSendSms.exe!_D4core6thread6Thread9isRunningMFNbNdZb() + 0x1
bytes D
testSendSms.exe!_D2gc4impl12conservative2gc3Gcx10smallAllocMFNbhKkkZPv() +
0x2a6 bytes D
testSendSms.exe!_D2gc4impl12conservative2gc14ConservativeGC6qallocMFNbkkxC8TypeInfoZS4core6memory8BlkInfo_()
+ 0x6d bytes D
then found these in core.thread.d
private bool suspend( Thread t ) nothrow
{
.........
version( Windows )
{
if( t.m_addr != GetCurrentThreadId() && SuspendThread(
t.m_hndl ) == 0xFFFFFFFF )
{
if( !t.isRunning )
{
Thread.remove( t );
return false;
}
onThreadError( "Unable to suspend thread" );
}
.......
}
........
}
I think the problem is when GC detects if the threading is
runnig, using core.thread.isRunning, the thread pointer is null.
When dll is loaded, it calls Runtime.initialize(),
gc_setProxy(gc) as the wiki says, so I have no idea why this
happened, and how to fix it. Could someone give me a hint ?
Thanks!