X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Futils%2FPanic.lhs;h=170a7a71d714d968313f29e7bc4e13f794253c8a;hb=dfbf36a9588da7d50467950603fc3385088b4f72;hp=01d1568c78145a5921690c8ee00466092eff703b;hpb=bd881529c7dd070b79fc8ad4aa3ac47bc79fbe96;p=ghc-hetmet.git diff --git a/ghc/compiler/utils/Panic.lhs b/ghc/compiler/utils/Panic.lhs index 01d1568..170a7a7 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 "config.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 ) @@ -155,7 +175,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}