Re: [GHC] #5902: Cannot tell from an exception handler whether the exception was asynchronous

#5902: Cannot tell from an exception handler whether the exception was asynchronous ---------------------------------+------------------------------------------ Reporter: simonmar | Owner: simonmar Type: bug | Status: new Priority: high | Milestone: 7.8.1 Component: Compiler | Version: 7.4.1 Keywords: | Os: Unknown/Multiple Architecture: Unknown/Multiple | Failure: None/Unknown Difficulty: Unknown | Testcase: Blockedby: | Blocking: Related: | ---------------------------------+------------------------------------------ Changes (by igloo): * priority: normal => high * milestone: 7.6.2 => 7.8.1 Comment: I think we've been running into problems with this when using the GHC API, with the same async exception being caught multiple times. Here's a small testcase of what I think is going on: {{{ import Control.Concurrent import Control.Exception import System.IO.Error import System.IO.Unsafe -- Our code: main = do tid <- myThreadId forkIO $ do threadDelay 1000 throwTo tid UserInterrupt print i `catch` \e -> putStrLn ("Got " ++ show (e :: AsyncException)) print i `catch` \e -> putStrLn ("Got " ++ show (e :: AsyncException)) -- A small simulation of the GHC API: f :: IO Integer f = (return $! sum [1..10000000]) `catchIOError` \_ -> return 3 i :: Integer i = unsafePerformIO f }}} Although we only throw `UserInterrupt` once, we catch it twice: {{{ $ ghc -O --make exc $ ./exc Got user interrupt Got user interrupt }}} Unfortunately, I can't see a workaround if you want to use async exceptions with the GHC API. Once you throw one, there's a chance that an `unsafePerformIO` thunk somewhere inside the GHC API will end up containing it as a synchronous exception, and then any call to the GHC API that uses that thunk will just throw that exception. -- Ticket URL: http://hackage.haskell.org/trac/ghc/ticket/5902#comment:5 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler
participants (1)
-
GHC