From 6ff1e84bcef3c4aba42c1b6e90f2eba84c8b02ac Mon Sep 17 00:00:00 2001 From: stolz Date: Thu, 5 Dec 2002 14:20:56 +0000 Subject: [PATCH] [project @ 2002-12-05 14:20:55 by stolz] Add SA_RESETHAND (aka SA_ONESHOT) support. Requested by: John Meacham > module Main where > import System.Posix.Signals > main = do > installHandler sigUSR1 (Catch (print "usr1")) Nothing > installHandler sigUSR2 (CatchOnce (print "usr2")) Nothing > _ <- getLine > return () --- ghc/includes/Signals.h | 3 ++- ghc/rts/Signals.c | 8 ++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/ghc/includes/Signals.h b/ghc/includes/Signals.h index b2b588b..c6c74fd 100644 --- a/ghc/includes/Signals.h +++ b/ghc/includes/Signals.h @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: Signals.h,v 1.1 2002/09/06 14:34:14 simonmar Exp $ + * $Id: Signals.h,v 1.2 2002/12/05 14:20:55 stolz Exp $ * * (c) The GHC Team, 1998-2002 * @@ -14,6 +14,7 @@ #define STG_SIG_IGN (-2) #define STG_SIG_ERR (-3) #define STG_SIG_HAN (-4) +#define STG_SIG_RST (-5) extern int stg_sig_install (int, int, StgStablePtr *, void *); diff --git a/ghc/rts/Signals.c b/ghc/rts/Signals.c index 68a9d5c..b8d2cf3 100644 --- a/ghc/rts/Signals.c +++ b/ghc/rts/Signals.c @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: Signals.c,v 1.29 2002/09/17 12:11:45 simonmar Exp $ + * $Id: Signals.c,v 1.30 2002/12/05 14:20:55 stolz Exp $ * * (c) The GHC Team, 1998-1999 * @@ -228,9 +228,13 @@ stg_sig_install(int sig, int spi, StgStablePtr *handler, void *mask) break; case STG_SIG_HAN: + case STG_SIG_RST: handlers[sig] = (StgInt)*handler; sigaddset(&userSignals, sig); action.sa_handler = generic_handler; + if (spi == STG_SIG_RST) { + action.sa_flags = SA_RESETHAND; + } n_haskell_handlers++; break; @@ -243,7 +247,7 @@ stg_sig_install(int sig, int spi, StgStablePtr *handler, void *mask) else sigemptyset(&action.sa_mask); - action.sa_flags = sig == SIGCHLD && nocldstop ? SA_NOCLDSTOP : 0; + action.sa_flags |= sig == SIGCHLD && nocldstop ? SA_NOCLDSTOP : 0; if (sigaction(sig, &action, NULL) || sigprocmask(SIG_SETMASK, &osignals, NULL)) -- 1.7.10.4