Clean up remnants of the Event Manager after forkProcess. Closes #4449
authorDmitry Astapov <dastapov@gmail.com>
Wed, 19 Jan 2011 10:33:00 +0000 (10:33 +0000)
committerDmitry Astapov <dastapov@gmail.com>
Wed, 19 Jan 2011 10:33:00 +0000 (10:33 +0000)
System/Event/Manager.hs
System/Event/Thread.hs

index c47b6c6..0c8293f 100644 (file)
@@ -14,6 +14,7 @@ module System.Event.Manager
     , loop
     , step
     , shutdown
+    , cleanup
     , wakeManager
 
       -- * Registering interest in I/O events
index 59bf7e8..9c58a5a 100644 (file)
@@ -127,7 +127,17 @@ ensureIOManagerIsRunning
       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