X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Futils%2FPanic.lhs;h=2a5d3a417482f6b5aff0cadafc263ba0c4fd9ea2;hb=423d477bfecd490de1449c59325c8776f91d7aac;hp=01d1568c78145a5921690c8ee00466092eff703b;hpb=bd881529c7dd070b79fc8ad4aa3ac47bc79fbe96;p=ghc-hetmet.git diff --git a/ghc/compiler/utils/Panic.lhs b/ghc/compiler/utils/Panic.lhs index 01d1568..2a5d3a4 100644 --- a/ghc/compiler/utils/Panic.lhs +++ b/ghc/compiler/utils/Panic.lhs @@ -14,17 +14,37 @@ module Panic GhcException(..), ghcError, progName, panic, panic#, assertPanic, trace, showException, showGhcException, tryMost, + installSignalHandlers, -#if __GLASGOW_HASKELL__ <= 408 - catchJust, ioErrors, throwTo, -#endif + catchJust, tryJust, ioErrors, throwTo, ) where #include "HsVersions.h" +#include "../includes/ghcconfig.h" import Config import FastTypes +#ifndef mingw32_HOST_OS +# if __GLASGOW_HASKELL__ > 504 +import System.Posix.Signals +# else +import Posix ( Handler(Catch), installHandler, sigINT, sigQUIT ) +# endif /* GHC > 504 */ + +import CONCURRENT ( myThreadId ) +#endif /* mingw32_HOST_OS */ + +# if __GLASGOW_HASKELL__ < 500 +import EXCEPTION ( raiseInThread ) +# else +import EXCEPTION ( throwTo ) +# endif /* GHC < 500 */ + +#if __GLASGOW_HASKELL__ > 408 +import EXCEPTION ( catchJust, tryJust, ioErrors ) +#endif + import DYNAMIC import qualified EXCEPTION as Exception import TRACE ( trace ) @@ -101,10 +121,16 @@ showGhcException (Panic s) ++ "to glasgow-haskell-bugs@haskell.org,\n" ++ "or http://sourceforge.net/projects/ghc/.\n\n") +#if __GLASGOW_HASKELL__ < 603 +myMkTyConApp = mkAppTy +#else +myMkTyConApp = mkTyConApp +#endif + ghcExceptionTc = mkTyCon "GhcException" {-# NOINLINE ghcExceptionTc #-} instance Typeable GhcException where - typeOf _ = mkAppTy ghcExceptionTc [] + typeOf _ = myMkTyConApp ghcExceptionTc [] \end{code} Panics and asserts. @@ -155,7 +181,25 @@ Compatibility stuff: \begin{code} #if __GLASGOW_HASKELL__ <= 408 catchJust = Exception.catchIO +tryJust = Exception.tryIO ioErrors = Exception.justIoErrors throwTo = Exception.raiseInThread #endif \end{code} + +Standard signal handlers for catching ^C, which just throw an +exception in the main thread. NOTE: must be called from the main +thread. + +\begin{code} +installSignalHandlers :: IO () +installSignalHandlers = do +#ifndef mingw32_HOST_OS + main_thread <- myThreadId + let sig_handler = Catch (throwTo main_thread + (Exception.DynException (toDyn Interrupted))) + installHandler sigQUIT sig_handler Nothing + installHandler sigINT sig_handler Nothing +#endif + return () +\end{code}