- withSignalHandlerLock $
- alloca $ \p_sp -> do
- sptr <- newStablePtr handler
- poke p_sp sptr
- stg_sig_install sig STG_SIG_RST p_sp nullPtr
- return ()
-
-withSignalHandlerLock :: IO () -> IO ()
-withSignalHandlerLock io
- = block $ do
- takeMVar signalHandlerLock
- catchAny (unblock io) (\e -> do putMVar signalHandlerLock (); throw e)
- putMVar signalHandlerLock ()
+ _ <- setHandler sig (Just (const handler, toDyn handler))
+ _ <- stg_sig_install sig STG_SIG_RST nullPtr
+ -- STG_SIG_RST: the second ^C kills us for real, just in case the
+ -- RTS or program is unresponsive.
+ return ()