0 | module System.Linux.Epoll
5 | import Derive.Prelude
6 | import public System.Linux.Error
7 | import public System.Linux.File
11 | %language ElabReflection
17 | export %foreign "C:ep_epollin,epoll-idris"
20 | export %foreign "C:ep_epollout,epoll-idris"
23 | export %foreign "C:ep_epollrdhup,epoll-idris"
26 | export %foreign "C:ep_epollpri,epoll-idris"
29 | export %foreign "C:ep_epollerr,epoll-idris"
32 | export %foreign "C:ep_epollhup,epoll-idris"
45 | %runElab derive "Events" [Show,Eq,Ord]
48 | eventCode : Events -> Bits32
52 | Semigroup Events where
53 | E x <+> E y = E (x .|. y)
65 | EPOLLOUT = E epollout
69 | EPOLLRDHUP = E epollrdhup
73 | EPOLLPRI = E epollpri
77 | EPOLLERR = E epollerr
81 | EPOLLHUP = E epollhup
87 | export %foreign "C:ep_epollet,epoll-idris"
90 | export %foreign "C:ep_epolloneshot,epoll-idris"
91 | epolloneshot : Bits32
93 | export %foreign "C:ep_epollwakeup,epoll-idris"
94 | epollwakeup : Bits32
96 | export %foreign "C:ep_epollexclusive,epoll-idris"
97 | epollexclusive : Bits32
104 | %runElab derive "Flags" [Show,Eq,Ord]
107 | flagCode : Flags -> Bits32
111 | Semigroup Flags where
112 | F x <+> F y = F (x .|. y)
120 | EPOLLET = F epollet
123 | EPOLLONESHOT : Flags
124 | EPOLLONESHOT = F epolloneshot
127 | EPOLLWAKEUP : Flags
128 | EPOLLWAKEUP = F epollwakeup
131 | EPOLLEXCLUSIVE : Flags
132 | EPOLLEXCLUSIVE = F epollexclusive
138 | %foreign "C:close,epoll-idris"
139 | prim__close : Bits32 -> PrimIO ()
141 | %foreign "C:ep_epoll_add,epoll-idris"
142 | prim__epoll_add : Bits32 -> Bits32 -> Bits32 -> Bits32 -> PrimIO Int32
144 | %foreign "C:ep_epoll_mod,epoll-idris"
145 | prim__epoll_mod : Bits32 -> Bits32 -> Bits32 -> Bits32 -> PrimIO Int32
147 | %foreign "C:ep_epoll_del,epoll-idris"
148 | prim__epoll_del : Bits32 -> Bits32 -> PrimIO Int32
150 | %foreign "C__collect_safe:epoll_wait,epoll-idris"
151 | prim__epoll_wait : Bits32 -> AnyPtr -> Bits32 -> Int32 -> PrimIO Int32
153 | %foreign "C:epoll_create1,epoll-idris"
154 | prim__epoll_create1 : Bits32 -> PrimIO Int32
156 | %foreign "C:ep_allocEvent,epoll-idris"
157 | prim__ep_allocEvent : PrimIO AnyPtr
159 | %foreign "C:ep_getFile,epoll-idris"
160 | prim__ep_getFile : AnyPtr -> PrimIO Bits32
162 | %foreign "C:ep_getEvents,epoll-idris"
163 | prim__ep_getEvents : AnyPtr -> PrimIO Bits32
166 | record EpollEvent where
171 | record EpollEvents (n : Nat) where
176 | record EpollFD where
182 | Show EpollFD where show = show . file
184 | parameters {0 a : Type}
185 | {auto ef : FileDesc a}
190 | epollAdd : EpollFD -> a -> Events -> Flags -> PrimIO (Either EpollErr ())
191 | epollAdd (EFD ef _) f (E e) (F fl) w =
192 | let MkIORes n w := prim__epoll_add ef fl (fileDesc f) e w
198 | epollMod : EpollFD -> a -> Events -> Flags -> PrimIO (Either EpollErr ())
199 | epollMod (EFD ef _) f (E e) (F fl) w =
200 | let MkIORes n w := prim__epoll_mod ef fl (fileDesc f) e w
206 | epollDel : EpollFD -> a -> PrimIO (Either EpollErr ())
207 | epollDel (EFD ef _) f w =
208 | let MkIORes n w := prim__epoll_del ef (fileDesc f) w
214 | epollCreate : IO (Either EpollErr EpollFD)
217 | let MkIORes res w := prim__epoll_create1 0 w
221 | let MkIORes ptr w := prim__ep_allocEvent w
222 | in MkIORes (Right $
EFD (cast n) ptr) w
225 | data EpollRes : Type where
227 | Ev : (file : Bits32) -> (ev : Events) -> EpollRes
228 | Err : EpollErr -> EpollRes
230 | %runElab derive "EpollRes" [Show,Eq]
232 | fromLeft : Either EpollErr Void -> EpollRes
233 | fromLeft (Left e) = Err e
234 | fromLeft (Right v) impossible
237 | epollClose : EpollFD -> PrimIO ()
238 | epollClose e = close e.file
241 | epollWait : EpollFD -> (timeout : Int32) -> PrimIO EpollRes
242 | epollWait (EFD f p) timeout w=
243 | let MkIORes n w := prim__epoll_wait f p 1 timeout w
245 | 0 => MkIORes NoEv w
247 | let MkIORes f w := prim__ep_getFile p w
248 | MkIORes e w := prim__ep_getEvents p w
249 | in MkIORes (Ev f $
E e) w
251 | let MkIORes e w := getErr w
252 | in MkIORes (fromLeft e) w
255 | epollWaitTimeout : EpollFD -> (ms : Bits32) -> PrimIO EpollRes
256 | epollWaitTimeout fd = epollWait fd . cast
259 | epollNoWait : EpollFD -> PrimIO EpollRes
260 | epollNoWait fd = epollWait fd 0