Re: [GHC] #7229: Detecting if a process was killed by a signal is impossible

#7229: Detecting if a process was killed by a signal is impossible --------------------------------------+------------------------------------ Reporter: benmachine | Owner: Type: bug | Status: new Priority: high | Milestone: 7.8.1 Component: libraries/process | Version: Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: Unknown/Multiple Type of failure: None/Unknown | Difficulty: Unknown Test Case: | Blocked By: Blocking: | Related Tickets: --------------------------------------+------------------------------------ Comment (by hvr): So, the implementation of the last proposal ammmounts to two simple modifications: a patch to `process`: {{{#!diff diff --git a/cbits/runProcess.c b/cbits/runProcess.c index 3462cfc..3a6f2f3 100644 --- a/cbits/runProcess.c +++ b/cbits/runProcess.c @@ -22,12 +22,12 @@ UNIX versions ------------------------------------------------------------------------- */ -// -// If a process terminates with a signal, the exit status we return to -// via the System.Process API follows the Unix shell convention of -// (128 + signal). -// -#define TERMSIG_STATUS(r) ((r) | 0x80) +// If a process was terminated by a signal, the exit status we return +// via the System.Process API is (signum << 8); this avoids collision +// with normal process termination status codes, as according to +// http://pubs.opengroup.org/onlinepubs/9699919799/functions/wait.html +// WEXITSTATUS(s) returns an 8-bit value. See also #7229. +#define TERMSIG_STATUS(r) (r << 8) static long max_fd = 0; }}} ...and a patch for `base` (provided by duncan): {{{#!diff diff --git a/GHC/TopHandler.lhs b/GHC/TopHandler.lhs index 9e4bc07..b0c5d0d 100644 --- a/GHC/TopHandler.lhs +++ b/GHC/TopHandler.lhs @@ -180,7 +180,25 @@ flushStdHandles = do -- we have to use unsafeCoerce# to get the 'IO a' result type, since the -- compiler doesn't let us declare that as the result type of a foreign export. safeExit :: Int -> IO a +#ifdef mingw32_HOST_OS safeExit r = unsafeCoerce# (shutdownHaskellAndExit $ fromIntegral r) +#else +-- On Unix we use an encoding for the ExitCode: +-- high 7 bits signal, low 8 bits normal exit code. +-- People can also use ExitCode that do not correspond to Unix exit() +-- codes and we just use a replacement. +safeExit r + | sig /= 0 && code == 0 && other == 0 + = unsafeCoerce# (shutdownHaskellAndSignal $ fromIntegral sig) + | sig == 0 && other == 0 + = unsafeCoerce# (shutdownHaskellAndExit $ fromIntegral code) + | otherwise + = unsafeCoerce# (shutdownHaskellAndExit 0xff) + where + sig = (r .&. 0x7f00) `shiftR` 8 + code = r .&. 0x00ff + other = r .&. (complement 0x7fff) +#endif }}} If there are no objections left, I'll apply the changes above, `validate` (tweaking the testsuite if necessary) and push the changes. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/7229#comment:29 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler
participants (1)
-
GHC