• simonmar's avatar
    [project @ 2004-09-28 15:08:58 by simonmar] · 07291441
    simonmar authored
    rts_evalStableIO: set rtsApiCapability to NULL *before* calling
    scheduleWaitThread, matching the way the other eval_* functions do
    The previous way lead to a suble race condition:
      - thread A calls rts_evalIO, enters scheduleWaitThread()
        (rtsApiCapability == NULL).
      - thread B calls rts_evalStableIO, creates a main thread and enters
        scheduleWaitThread() (rtsApiCapability == &MainCapability)
      - thread A exits scheduleWaitThread, sees that rtsApiCapability is
        non-NULL, and calls releaseCapability() on it.  This is bogus,
        because thread A doesn't actually hold the capability, and we've
        done a double-release.
    This scenario leads to assertion failures in a debug threaded RTS, and
    probably crashes in a non-debug threaded RTS.
RtsAPI.c 12.1 KB