[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


           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
            pusha   ;

        assert(sig == SIGUSR1);
        // Move sem_post to after t.stackTop = getESP();

        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()

        // Restore all registers
            popa    ;

I have already verified that this modification fixes the problem.


More information about the Digitalmars-d-bugs mailing list