FIX part of #2301, and #1619
authorSimon Marlow <marlowsd@gmail.com>
Wed, 9 Jul 2008 08:49:16 +0000 (08:49 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Wed, 9 Jul 2008 08:49:16 +0000 (08:49 +0000)
commitaddff19a9c6ee89e36cb966988aa9f868ae2e4a6
tree8c1e44ba372c452aa284170f8aa22b265040efa3
parent5f923aab146d892f019ff1c1627edf20378a3aac
FIX part of #2301, and #1619

2301: Control-C now causes the new exception (AsyncException
UserInterrupt) to be raised in the main thread.  The signal handler
is set up by GHC.TopHandler.runMainIO, and can be overriden in the
usual way by installing a new signal handler.  The advantage is that
now all programs will get a chance to clean up on ^C.

When UserInterrupt is caught by the topmost handler, we now exit the
program via kill(getpid(),SIGINT), which tells the parent process that
we exited as a result of ^C, so the parent can take appropriate action
(it might want to exit too, for example).

One subtlety is that we have to use a weak reference to the ThreadId
for the main thread, so that the signal handler doesn't prevent the
main thread from being subject to deadlock detection.

1619: we now ignore SIGPIPE by default.  Although POSIX says that a
SIGPIPE should terminate the process by default, I wonder if this
decision was made because many C applications failed to check the exit
code from write().  In Haskell a failed write due to a closed pipe
will generate an exception anyway, so the main difference is that we
now get a useful error message instead of silent program termination.
See #1619 for more discussion.
includes/RtsAPI.h
rts/Linker.c
rts/RtsSignals.h
rts/RtsStartup.c
rts/posix/Signals.c
rts/win32/ConsoleHandler.c