[Bug 114] New: Multithreaded applications crash upon garbage collection
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Mon Apr 24 07:07:35 PDT 2006
http://d.puremagic.com/bugzilla/show_bug.cgi?id=114
Summary: Multithreaded applications crash upon garbage collection
Product: D
Version: 0.154
Platform: PC
OS/Version: Linux
Status: NEW
Keywords: patch
Severity: critical
Priority: P1
Component: Phobos
AssignedTo: bugzilla at digitalmars.com
ReportedBy: juanjo at comellas.com.ar
There is a problem in std/thread.d in Phobos that appears when the garbage
collector runs and the gcx.mark() method is executed. Dave
<dave_member at pathlink.com> provided a fix for this with the following message:
The problem is that the t.stackTop is not valid when it is passed into
gcx.mark() because it is being munged as pauseAll returns (and lets the
GC commence) before the stackTop is set for all of the paused threads.
extern (C) static void pauseHandler(int sig)
{
int result;
// Save all registers on the stack so they'll be scanned by the GC
asm
{
pusha ;
}
assert(sig == SIGUSR1);
// Move sem_post to after t.stackTop = getESP();
//sem_post(&flagSuspend);
sigset_t sigmask;
result = sigfillset(&sigmask);
assert(result == 0);
result = sigdelset(&sigmask, SIGUSR2);
assert(result == 0);
Thread t = getThis();
t.stackTop = getESP();
t.flags &= ~1;
sem_post(&flagSuspend); // HERE
while (1)
{
sigsuspend(&sigmask); // suspend until SIGUSR2
if (t.flags & 1) // ensure it was resumeHandler()
break;
}
// Restore all registers
asm
{
popa ;
}
}
I have already verified that this modification fixes the problem.
--
More information about the Digitalmars-d-bugs
mailing list