packages feed

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