7 | module System.Linux.EventFD
10 | import Derive.Prelude
11 | import System.Linux.Error
12 | import System.Linux.File
14 | %language ElabReflection
21 | %foreign "C:ep_readEventFile,epoll-idris"
22 | prim__ep_readEventFile : Bits32 -> PrimIO Bits64
24 | %foreign "C:ep_writeEventFile,epoll-idris"
25 | prim__ep_writeEventFile : Bits32 -> Bits64 -> PrimIO ()
27 | %foreign "C:ep_efd_cloexec,epoll-idris"
28 | ep_efd_cloexec : Bits32
30 | %foreign "C:ep_efd_nonblock,epoll-idris"
31 | ep_efd_nonblock : Bits32
33 | %foreign "C:ep_efd_semaphore,epoll-idris"
34 | ep_efd_semaphore : Bits32
36 | %foreign "C:eventfd,epoll-idris"
37 | prim__eventfd : Bits64 -> Bits32 -> PrimIO Bits32
51 | %runElab derive "Flags" [Show,Eq,Ord]
54 | flagCode : Flags -> Bits32
58 | Semigroup Flags where
59 | F x <+> F y = F (x .|. y)
62 | Monoid Flags where neutral = F 0
66 | EFD_CLOEXEC = F ep_efd_cloexec
75 | EFD_NONBLOCK : Flags
76 | EFD_NONBLOCK = F ep_efd_nonblock
84 | EFD_SEMAPHORE : Flags
85 | EFD_SEMAPHORE = F ep_efd_semaphore
90 | record EventFD where
95 | FileDesc EventFD where fileDesc = file
99 | eventfd : (init : Bits64) -> Flags -> PrimIO EventFD
100 | eventfd i (F f) w =
101 | let MkIORes file w := prim__eventfd i f w
102 | in MkIORes (EFD file) w
107 | writeEv : EventFD -> Bits64 -> PrimIO ()
108 | writeEv (EFD f) v = prim__ep_writeEventFile f v
117 | readEv : EventFD -> PrimIO (Either EpollErr Bits64)
119 | let MkIORes v w := prim__ep_readEventFile f w
122 | n => MkIORes (Right n) w
126 | withEv : Bits64 -> Flags -> (EventFD -> PrimIO a) -> PrimIO a
128 | let MkIORes ev w := eventfd i fs w
129 | MkIORes res w := f ev w
130 | MkIORes _ w := close ev w