0 | module System.Posix.Poll.Struct
3 | import Derive.Prelude
4 | import System.Posix.File.FileDesc
5 | import System.Posix.Poll.Types
8 | %language ElabReflection
14 | %foreign "C:get_pollfd_fd, posix-idris"
15 | prim__get_pollfd_fd: AnyPtr -> PrimIO Bits32
17 | %foreign "C:set_pollfd_fd, posix-idris"
18 | prim__set_pollfd_fd: AnyPtr -> Bits32 -> PrimIO ()
20 | %foreign "C:get_pollfd_events, posix-idris"
21 | prim__get_pollfd_events: AnyPtr -> PrimIO Bits32
23 | %foreign "C:set_pollfd_events, posix-idris"
24 | prim__set_pollfd_events: AnyPtr -> Bits32 -> PrimIO ()
26 | %foreign "C:get_pollfd_revents, posix-idris"
27 | prim__get_pollfd_revents: AnyPtr -> PrimIO Bits32
29 | %foreign "C:set_pollfd_revents, posix-idris"
30 | prim__set_pollfd_revents: AnyPtr -> Bits32 -> PrimIO ()
38 | record SPollFD (s : Type) where
43 | Struct SPollFD where
47 | public export %inline
48 | SizeOf (SPollFD s) where
49 | sizeof_ = pollfd_size
53 | PollFD = SPollFD World
57 | pollfd : SPollFD s -> F1 s Fd
59 | let v # t := ffi (prim__get_pollfd_fd p) t
64 | setPollfd : SPollFD s -> Fd -> F1' s
65 | setPollfd (PF p) (MkFd v) = ffi (prim__set_pollfd_fd p v)
69 | events : SPollFD s -> F1 s PollEvent
71 | let v # t := ffi (prim__get_pollfd_events p) t
76 | setEvents : SPollFD s -> PollEvent -> F1' s
77 | setEvents (PF p) (PE v) = ffi (prim__set_pollfd_events p v)
81 | revents : SPollFD s -> F1 s PollEvent
83 | let v # t := ffi (prim__get_pollfd_revents p) t
88 | setRevents : SPollFD s -> PollEvent -> F1' s
89 | setRevents (PF p) (PE v) = ffi (prim__set_pollfd_revents p v)
96 | record PollPair where
101 | %runElab derive "PollPair" [Show,Eq]
104 | pollResults : {n : _} -> CArray s n (SPollFD s) -> F1 s (List PollPair)
105 | pollResults arr = go [] n
107 | go : List PollPair -> (m : Nat) -> (0 p : LTE m n) => F1 s (List PollPair)
110 | let spfd # t := getStructNat arr k t
111 | fd # t := pollfd spfd t
112 | evs # t := revents spfd t
113 | in if evs == 0 then go xs k t else go (PP fd evs :: xs) k t
116 | writeFiles : {n : _} -> CArray s n (SPollFD s) -> List PollPair -> F1' s
117 | writeFiles arr = go n
119 | go : (m : Nat) -> (ix : Ix m n) => List PollPair -> F1' s
120 | go (S k) (x::xs) t =
121 | let spfd # t := getStructIx arr k t
122 | _ # t := setPollfd spfd x.fd t
123 | _ # t := setEvents spfd x.events t