epoll-0.2: examples/Stdin.hs
module Main where
import System.Linux.Epoll
import System.Posix.IO
import System.IO
import Data.Maybe
import Text.Printf
import Control.Concurrent.MVar
eventTypes :: EventType
eventTypes = combineEvents [inEvent, edgeTriggeredEvent, oneShotEvent]
callback :: MVar () -> Device -> Event Data -> IO ()
callback lck d e = do
let et = eventType e
fd = eventFd e
printf "event=%s, fd=%s\n" (show et) (show fd)
(s, c) <- fdRead fd 16 `catch` \er -> print er >> return ("", 0)
printf "read %s byte(s): %s\n" (show c) s
if s == "quit\n"
then putMVar lck ()
else reEnableCallback d (eventRef e) (eventDesc e)
main :: IO ()
main = do
let s = fromJust $ toSize 32
lock <- newEmptyMVar
loop <- createEventLoop s
addCallback loop stdInput [(eventTypes, callback lock)]
putStrLn "Enter 'quit' to exit."
takeMVar lock