Ctrl-Break handler don't work in forked threads in "-threaded" RTS

Bulat Ziganshin bulatz at HotPOP.com
Thu Dec 8 16:21:25 EST 2005


Hello Simon,

the following program demonstrates bug in 6.4.1 (6.4.0 was ok).
if you compile it with "-threaded", run and press Ctrl-Break, you will
see message "main.EXE: <stdin>: hGetLine: end of file" and program
blocks (because forked thread is dead). the problem is that installed
ctrl-break handler don't called in forked threads

if you compile program without "-threaded" or with 6.4.0, it works as
expected - pressing Ctrl-Break runs my handler so you will see
"^Break! main.EXE: thread killed" message



import Control.Concurrent
import Control.Exception
import GHC.ConsoleHandler

handleCtrlBreak action = do
  myThread <- myThreadId
  let onBreak event = do
        putStrLn " ^Break!"
        killThread myThread
  bracket (installHandler$ Catch onBreak) (installHandler) $  \oldHandler -> do
    action

main =  do
  handleCtrlBreak $ do
    x <- newEmptyMVar
    forkIO$ do a <- getLine
               print a
               putMVar x ()
               return ()
    takeMVar x
    return ()
  

-- 
Best regards,
 Bulat                          mailto:bulatz at HotPOP.com






More information about the Glasgow-haskell-bugs mailing list