import GHC.IO (mask_, onException)
import GHC.IO.Exception (ioError)
import GHC.MVar (MVar, newEmptyMVar, newMVar, putMVar, takeMVar)
-import GHC.Real (fromIntegral)
import System.Event.Internal (eventIs, evtClose)
import System.Event.Manager (Event, EventManager, evtRead, evtWrite, loop,
new, registerFd, unregisterFd_, registerTimeout)
s <- threadStatus t
case s of
ThreadFinished -> create
- ThreadDied -> create
+ ThreadDied -> do
+ -- Sanity check: if the thread has died, there is a chance
+ -- that event manager is still alive. This could happend during
+ -- the fork, for example. In this case we should clean up
+ -- open pipes and everything else related to the event manager.
+ -- See #4449
+ mem <- readIORef eventManager
+ _ <- case mem of
+ Nothing -> return ()
+ Just em -> M.cleanup em
+ create
_other -> return st
foreign import ccall unsafe "rtsSupportsBoundThreads" threaded :: Bool