RE: signal handling and optimisation

I'm trying to write some code that catches unix signals and turns them into GHC exceptions, GHC version 6.0, debian linux
Heres my code:
------ module Main where
import Control.Concurrent import Control.Exception import System.Posix import IO
catchCtrlC :: IO Handler catchCtrlC = do main_thread <- myThreadId installHandler sigINT (Catch (handler main_thread)) Nothing where handler :: ThreadId -> IO () handler main_thread = throwTo main_thread (ErrorCall "Kaboom")
main :: IO () main = do catchCtrlC print (f 1)
f :: Int -> Int f x = f (x + 1) ------
The function "f" is intentionally bogus, I want it to loop so I have enough time to hit cntrl-C.
You've hit a known bug with concurrency, described in the Control.Concurrent documentation. The problem is that context switches only happen when some allocation is going on: in your f function above, the optimiser turns it into a loop that does no allocation, so no context switches can happen and the exception is never delivered. You probably won't run into this bug in a real program ;-) Cheers, Simon
participants (1)
-
Simon Marlow