Allow disabling signal support in configure.

This commit is contained in:
bringert
2005-11-11 10:12:49 +00:00
parent 09a705d192
commit a51f7dad56
6 changed files with 123 additions and 35 deletions

21
src/GF/System/NoSignal.hs Normal file
View File

@@ -0,0 +1,21 @@
----------------------------------------------------------------------
-- |
-- Module : GF.System.NoSignal
-- Maintainer : Bjorn Bringert
-- Stability : (stability)
-- Portability : (portability)
--
-- > CVS $Date: 2005/11/11 11:12:50 $
-- > CVS $Author: bringert $
-- > CVS $Revision: 1.1 $
--
-- Dummy implementation of signal handling.
-----------------------------------------------------------------------------
module GF.System.NoSignal where
import Control.Exception (Exception)
{-# NOINLINE runInterruptibly #-}
runInterruptibly :: IO a -> IO (Either Exception a)
runInterruptibly = fmap Right

View File

@@ -1,3 +1,5 @@
{-# OPTIONS -cpp #-}
----------------------------------------------------------------------
-- |
-- Module : GF.System.Signal
@@ -5,44 +7,21 @@
-- Stability : (stability)
-- Portability : (portability)
--
-- > CVS $Date: 2005/11/07 22:27:13 $
-- > CVS $Date: 2005/11/11 11:12:50 $
-- > CVS $Author: bringert $
-- > CVS $Revision: 1.2 $
-- > CVS $Revision: 1.3 $
--
-- Allows SIGINT (Ctrl-C) to interrupt computations.
-- Import the right singal handling module.
-----------------------------------------------------------------------------
module GF.System.Signal where
module GF.System.Signal (runInterruptibly) where
import Control.Concurrent (myThreadId, killThread)
import Control.Exception (Exception,catch)
import Prelude hiding (catch)
import System.IO
import System.Posix.Signals
#ifdef USE_INTERRUPT
-- | Run an IO action, and allow it to be interrupted
-- by a SIGINT to the current process. Returns
-- an exception if the process did not complete
-- normally.
-- NOTES:
-- * This will replace any existing SIGINT
-- handler during the action. After the computation
-- has completed the existing handler will be restored.
-- * If the IO action is lazy (e.g. using readFile,
-- unsafeInterleaveIO etc.) the lazy computation will
-- not be interruptible, as it will be performed
-- after the signal handler has been removed.
runInterruptibly :: IO a -> IO (Either Exception a)
runInterruptibly a =
do t <- myThreadId
oldH <- installHandler sigINT (Catch (killThread t)) Nothing
x <- p `catch` h
installHandler sigINT oldH Nothing
return x
where p = a >>= \x -> return $! Right $! x
h e = return $ Left e
import GF.System.UseSignal (runInterruptibly)
-- | Like 'runInterruptibly', but always returns (), whether
-- the computation fails or not.
runInterruptibly_ :: IO () -> IO ()
runInterruptibly_ = fmap (either (const ()) id) . runInterruptibly
#else
import GF.System.NoSignal (runInterruptibly)
#endif

View File

@@ -0,0 +1,50 @@
----------------------------------------------------------------------
-- |
-- Module : GF.System.UseSignal
-- Maintainer : Bjorn Bringert
-- Stability : (stability)
-- Portability : (portability)
--
-- > CVS $Date: 2005/11/11 11:12:50 $
-- > CVS $Author: bringert $
-- > CVS $Revision: 1.1 $
--
-- Allows SIGINT (Ctrl-C) to interrupt computations.
-----------------------------------------------------------------------------
module GF.System.UseSignal where
import Control.Concurrent (myThreadId, killThread)
import Control.Exception (Exception,catch)
import Prelude hiding (catch)
import System.IO
import System.Posix.Signals
{-# NOINLINE runInterruptibly #-}
-- | Run an IO action, and allow it to be interrupted
-- by a SIGINT to the current process. Returns
-- an exception if the process did not complete
-- normally.
-- NOTES:
-- * This will replace any existing SIGINT
-- handler during the action. After the computation
-- has completed the existing handler will be restored.
-- * If the IO action is lazy (e.g. using readFile,
-- unsafeInterleaveIO etc.) the lazy computation will
-- not be interruptible, as it will be performed
-- after the signal handler has been removed.
runInterruptibly :: IO a -> IO (Either Exception a)
runInterruptibly a =
do t <- myThreadId
oldH <- installHandler sigINT (Catch (killThread t)) Nothing
x <- p `catch` h
installHandler sigINT oldH Nothing
return x
where p = a >>= \x -> return $! Right $! x
h e = return $ Left e
-- | Like 'runInterruptibly', but always returns (), whether
-- the computation fails or not.
runInterruptibly_ :: IO () -> IO ()
runInterruptibly_ = fmap (either (const ()) id) . runInterruptibly

View File

@@ -46,6 +46,9 @@ ifneq ("$(LDFLAGS)","")
GHCFLAGS += -optl'$(LDFLAGS)'
endif
ifeq ("$(INTERRUPT)","yes")
GHCFLAGS += -DUSE_INTERRUPT
endif
ifeq ("$(ENABLE_JAVA)", "yes")
BUILD_JAR=jar

View File

@@ -25,6 +25,8 @@ GHCI = "@GHCI@"
READLINE = @READLINE@
INTERRUPT = @INTERRUPT@
ENABLE_JAVA = @ENABLE_JAVA@
JAVAC = "@JAVAC@"

View File

@@ -4,7 +4,7 @@ AC_INIT([GF],[2.3],[aarne@cs.chalmers.se],[GF])
AC_PREREQ(2.53)
AC_REVISION($Revision: 1.25 $)
AC_REVISION($Revision: 1.26 $)
AC_CONFIG_FILES([config.mk jgf gfeditor])
@@ -82,6 +82,39 @@ esac
AC_SUBST(READLINE)
dnl ***********************************************
dnl command interruption
dnl ***********************************************
AC_ARG_WITH(interrupt,
AC_HELP_STRING([--with-interrupt=<allow command interruption>],
[Choose whether to enable interruption of commands
with SIGINT (Ctrl-C)
Available alternatives are: 'yes', 'no'
(default = yes)]),
[INTERRUPT="$withval"],
[if test "$host_os" = "cygwin"; then
AC_MSG_WARN([Command interruption does not work under
Cygwin, because of missing signal handler support.
Disabling command interruption support.
Use --with-interrupt to override.])
INTERRUPT="no"
else
INTERRUPT="yes"
fi])
case $INTERRUPT in
yes)
;;
no)
;;
*)
AC_MSG_ERROR([Bad value for --with-interrupt: $INTERRUPT])
;;
esac
AC_SUBST(INTERRUPT)
dnl ***********************************************
dnl java stuff
dnl ***********************************************