diff options
author | Simon Marlow <simonmar@microsoft.com> | 2006-03-20 12:43:33 +0000 |
---|---|---|
committer | Simon Marlow <simonmar@microsoft.com> | 2006-03-20 12:43:33 +0000 |
commit | d1372be09d76ea2cd50840f067d7ccd2585406f7 (patch) | |
tree | 9516da6bdd3cfb732677951f8a696e812db4b1d1 /libraries | |
parent | 5b9df10c2fe43ff3ea8d64cc37eeb9c2aca70d82 (diff) | |
download | haskell-d1372be09d76ea2cd50840f067d7ccd2585406f7.tar.gz |
add runIOFastExit :: IO a -> IO a
Similar to runIO, but calls stg_exit() directly to exit, rather than
shutdownHaskellAndExit(). Needed for running GHCi in the test suite.
Diffstat (limited to 'libraries')
-rw-r--r-- | libraries/base/GHC/TopHandler.lhs | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/libraries/base/GHC/TopHandler.lhs b/libraries/base/GHC/TopHandler.lhs index b1ac1b83c2..4785f61b51 100644 --- a/libraries/base/GHC/TopHandler.lhs +++ b/libraries/base/GHC/TopHandler.lhs @@ -16,7 +16,7 @@ -- #hide module GHC.TopHandler ( - runMainIO, runIO, runNonIO, reportStackOverflow, reportError + runMainIO, runIO, runIOFastExit, runNonIO, reportStackOverflow, reportError ) where import Prelude @@ -24,6 +24,7 @@ import Prelude import System.IO import Control.Exception +import Foreign.C ( CInt ) import GHC.IOBase import GHC.Exception import GHC.Prim (unsafeCoerce#) @@ -43,6 +44,22 @@ runMainIO main = (do a <- main; cleanUp; return a) `catchException` topHandler runIO :: IO a -> IO a runIO main = catchException main topHandler +-- | Like 'runIO', but in the event of an exception that causes an exit, +-- we don't shut down the system cleanly, we just exit. This is +-- useful in some cases, because the safe exit version will give other +-- threads a chance to clean up first, which might shut down the +-- system in a different way. For example, try +-- +-- main = forkIO (runIO (exitWith (ExitFailure 1))) >> threadDelay 10000 +-- +-- This will sometimes exit with "interrupted" and code 0, because the +-- main thread is given a chance to shut down when the child thread calls +-- safeExit. There is a race to shut down between the main and child threads. +-- +runIOFastExit :: IO a -> IO a +runIOFastExit main = catchException main topHandlerFastExit + -- NB. this is used by the testsuite driver + -- | The same as 'runIO', but for non-IO computations. Used for -- wrapping @foreign export@ and @foreign import \"wrapper\"@ when these -- are used to export Haskell functions with non-IO types. |