Skip to content

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

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 ()
Edited by Simon Marlow
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information