Skip to content
  • sof's avatar
    [project @ 2004-11-17 19:07:38 by sof] · 900ca61d
    sof authored
    Expose Win32 console event handling to the user.
    
    Added RTS support for registering and delivering console events quite
    a while ago (rts/win32/ConsoleHandler.c), but got bored with it before
    completing the job. Here's the concluding commit; it does the following:
    
    - new module, base/GHC/ConsoleHandler.hs which supports registering of
      console event handlers (the null module on plats other than mingw).
    - special handling of aborted async read()s on 'standard input' in
      rts/win32/IOManager.c (together with GHC.Conc.asyncRead). See comments
      in that IOManager.c as to why this is needed.
      [ Any other code that performs blocking I/O on 'standard input' will
        need to be tweaked too to be console event handler/signal friendly.]
    - for now, disable the delivery of 'close' events (see
      rts/win32/ConsoleHandler.c:generic_handler() for reasons why)
    
    Feel free to hoik GHC/ConsoleHandler.hs around the lib hierarchy to wherever
    is considered more fitting. Unifying functionality between System.Posix.Signals
    and GHC.ConsoleHandler is one (obvious) thing to do.
    
    -- Demonstrating GHC.ConsoleHandler use; win32 only
    module Main(main) where
    
    import GHC.ConsoleHandler
    import System.IO  (hFlush, stdout)
    import GHC.Conc   (threadDelay)
    
    main :: IO ()
    main = do
      installHandler (Catch (\ _ -> putStrLn "Caught console event; ignoring" >> hFlush stdout))
      loop
     where
      loop = do
        threadDelay 100000
        ls <- getLine
        putStrLn ls
        loop
    --
    900ca61d