• Simon Marlow's avatar
    Fix #3429: a tricky race condition · c5cafbcc
    Simon Marlow authored
    There were two bugs, and had it not been for the first one we would
    not have noticed the second one, so this is quite fortunate.
    
    The first bug is in stg_unblockAsyncExceptionszh_ret, when we found a
    pending exception to raise, but don't end up raising it, there was a
    missing adjustment to the stack pointer.  
    
    The second bug was that this case was actually happening at all: it
    ought to be incredibly rare, because the pending exception thread
    would have to be killed between us finding it and attempting to raise
    the exception.  This made me suspicious.  It turned out that there was
    a race condition on the tso->flags field; multiple threads were
    updating this bitmask field non-atomically (one of the bits is the
    dirty-bit for the generational GC).  The fix is to move the dirty bit
    into its own field of the TSO, making the TSO one word larger (sadly).
    c5cafbcc
Sanity.c 16.4 KB