[project @ 2004-11-17 19:07:38 by sof]
authorsof <unknown>
Wed, 17 Nov 2004 19:07:38 +0000 (19:07 +0000)
committersof <unknown>
Wed, 17 Nov 2004 19:07:38 +0000 (19:07 +0000)
commit5c640c3112220f47c56130e37c8ffaffea14f90d
tree759ba826a985c2aaf3c6cc7ae0378c71cc97c2e5
parent9d21497027ecdd0ccfa6d152bf120063e5fc6236
[project @ 2004-11-17 19:07:38 by sof]
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
--
GHC/Conc.lhs
GHC/ConsoleHandler.hs [new file with mode: 0644]