1 {-# OPTIONS -#include "PrelIOUtils.h" #-}
2 -- -----------------------------------------------------------------------------
4 -- (c) The University of Glasgow, 1994-2002
8 -- 'Top-level' IO actions want to catch exceptions (e.g., forkIO and
9 -- PrelMain.mainIO) and report them - topHandler is the exception
10 -- handler they should use for this:
12 -- make sure we handle errors while reporting the error!
13 -- (e.g. evaluating the string passed to 'error' might generate
14 -- another error, etc.)
16 -- These functions can't go in PrelMain, because PrelMain isn't
17 -- included in HSstd.o (because PrelMain depends on Main, which
18 -- doesn't exist yet...).
20 -- Note: used to be called PrelTopHandler.lhs, so if you're looking
21 -- for CVS info, try 'cvs log'ging it too.
22 module PrelTopHandler (
23 runMain, reportStackOverflow, reportError
33 -- runMain is applied to Main.main by TcModule
34 runMain :: IO a -> IO ()
35 runMain main = catchException (main >> return ()) topHandler
37 topHandler :: Exception -> IO ()
38 topHandler err = catchException (real_handler err) topHandler
40 real_handler :: Exception -> IO ()
43 AsyncException StackOverflow -> reportStackOverflow True
45 -- only the main thread gets ExitException exceptions
46 ExitException ExitSuccess -> shutdownHaskellAndExit 0
47 ExitException (ExitFailure n) -> shutdownHaskellAndExit n
49 Deadlock -> reportError True
50 "no threads to run: infinite loop or deadlock?"
52 ErrorCall s -> reportError True s
53 other -> reportError True (showsPrec 0 other "\n")
55 -- NOTE: shutdownHaskellAndExit must be called "safe", because it *can*
56 -- re-enter Haskell land through finalizers.
57 foreign import ccall "shutdownHaskellAndExit"
58 shutdownHaskellAndExit :: Int -> IO ()
60 reportStackOverflow :: Bool -> IO ()
61 reportStackOverflow bombOut = do
62 (hFlush stdout) `catchException` (\ _ -> return ())
69 reportError :: Bool -> String -> IO ()
70 reportError bombOut str = do
71 (hFlush stdout) `catchException` (\ _ -> return ())
72 withCStringLen str $ \(cstr,len) -> do
73 writeErrString errorHdrHook cstr len
79 foreign label "ErrorHdrHook" errorHdrHook :: Ptr ()
81 foreign import "_ErrorHdrHook" errorHdrHook :: Ptr ()
84 foreign import ccall "writeErrString__" unsafe
85 writeErrString :: Ptr () -> CString -> Int -> IO ()
87 -- SUP: Are the hooks allowed to re-enter Haskell land? If so, remove
89 foreign import ccall "stackOverflow" unsafe
90 callStackOverflowHook :: IO ()
92 foreign import ccall "stg_exit" unsafe
93 stg_exit :: Int -> IO ()