Ticket #637 (closed bug: fixed)
Ctrl-Break handler doesn't work in forked threads in "-threaded" RTS
| Reported by: | bulatz@… | Owned by: | simonmar |
|---|---|---|---|
| Priority: | high | Milestone: | 6.6.1 |
| Component: | Runtime System | Version: | 6.4.1 |
| Keywords: | Cc: | Bulat.Ziganshin@… | |
| Operating System: | Windows | Architecture: | Unknown/Multiple |
| Type of failure: | Difficulty: | Moderate (less than a day) | |
| Test Case: | Blocked By: | ||
| Blocking: | Related Tickets: |
Description (last modified by simonmar) (diff)
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 ()
Change History
Note: See
TracTickets for help on using
tickets.
