runInUnboundThread: block asynchronous exceptions before installing exception handler
authorBas van Dijk <v.dijk.bas@gmail.com>
Mon, 29 Mar 2010 13:15:49 +0000 (13:15 +0000)
committerBas van Dijk <v.dijk.bas@gmail.com>
Mon, 29 Mar 2010 13:15:49 +0000 (13:15 +0000)
Control/Concurrent.hs

index 75ee52e..ce668fb 100644 (file)
@@ -430,7 +430,10 @@ runInUnboundThread action = do
     if bound
         then do
             mv <- newEmptyMVar
-            _ <- forkIO (Exception.try action >>= putMVar mv)
+            b <- blocked
+            _ <- block $ forkIO $
+              Exception.try (if b then action else unblock action) >>=
+              putMVar mv
             takeMVar mv >>= \ei -> case ei of
                 Left exception -> Exception.throw (exception :: SomeException)
                 Right result -> return result