0 | module System.Posix.Signal.Struct
2 | import public Control.Monad.Resource
5 | import Data.Linear.Traverse1
6 | import Derive.Prelude
7 | import System.Posix.Errno
8 | import System.Posix.File.ReadRes
9 | import System.Posix.Signal.Types
12 | %language ElabReflection
14 | signals : List Signal
16 | map Signal.Types.S $
17 | if SIGRTMAX > 31 then [1..sig SIGRTMAX] else [1..31]
27 | %foreign "C:li_emptysigset, posix-idris"
28 | prim__emptysigset : PrimIO AnyPtr
30 | %foreign "C:li_fullsigset, posix-idris"
31 | prim__fullsigset : PrimIO AnyPtr
33 | %foreign "C:sigaddset, posix-idris"
34 | prim__sigaddset : AnyPtr -> Bits32 -> PrimIO ()
36 | %foreign "C:sigdelset, posix-idris"
37 | prim__sigdelset : AnyPtr -> Bits32 -> PrimIO ()
39 | %foreign "C:sigismember, posix-idris"
40 | prim__sigismember : AnyPtr -> Bits32 -> PrimIO CInt
42 | export %foreign "C:get_siginfo_t_si_signo, posix-idris"
43 | get_siginfo_t_si_signo: AnyPtr -> PrimIO Bits32
45 | export %foreign "C:get_siginfo_t_si_code, posix-idris"
46 | get_siginfo_t_si_code: AnyPtr -> PrimIO CInt
48 | export %foreign "C:get_siginfo_t_si_pid, posix-idris"
49 | get_siginfo_t_si_pid: AnyPtr -> PrimIO PidT
51 | export %foreign "C:get_siginfo_t_si_uid, posix-idris"
52 | get_siginfo_t_si_uid: AnyPtr -> PrimIO UidT
54 | export %foreign "C:get_siginfo_t_si_status, posix-idris"
55 | get_siginfo_t_si_status: AnyPtr -> PrimIO CInt
57 | export %foreign "C:get_siginfo_t_si_value, posix-idris"
58 | get_siginfo_t_si_value: AnyPtr -> PrimIO CInt
66 | record SigsetT where
71 | WrappedPtr SigsetT where
76 | freeSigset1 : SigsetT -> F1' World
77 | freeSigset1 (S p) = ffi $
prim__free p
80 | freeSigset : Lift1 World f => SigsetT -> f ()
81 | freeSigset p = lift1 (freeSigset1 p)
84 | ELift1 World f => Resource f SigsetT where
85 | cleanup = freeSigset
91 | emptySigset : PrimIO SigsetT
92 | emptySigset = primMap S prim__emptysigset
98 | fullSigset : PrimIO SigsetT
99 | fullSigset = primMap S prim__fullsigset
103 | sigaddset : (r : SigsetT) -> Signal -> F1 World ()
104 | sigaddset (S p) s = ffi $
prim__sigaddset p s.sig
108 | sigdelset : (r : SigsetT) -> Signal -> F1 World ()
109 | sigdelset (S p) s = ffi $
prim__sigdelset p s.sig
113 | sigismember : (r : SigsetT) -> Signal -> F1 World Bool
114 | sigismember (S p) s t =
115 | case ffi (prim__sigismember p s.sig) t of
121 | getSignals : (r : SigsetT) -> F1 World (List Signal)
122 | getSignals set = filterM [<] (sigismember set) values
125 | withSignals : List Signal -> (SigsetT -> EPrim a) -> EPrim a
126 | withSignals ss f t =
127 | let sigs # t := toF1 emptySigset t
128 | _ # t := traverse1_ (\s => sigaddset sigs s) ss t
129 | R res t := f sigs t
131 | let _ # t := freeSigset1 sigs t
133 | _# t := freeSigset1 sigs t
137 | withoutSignals : List Signal -> (SigsetT -> EPrim a) -> EPrim a
138 | withoutSignals ss f t =
139 | let sigs # t := toF1 fullSigset t
140 | _ # t := traverse1_ (\s => sigdelset sigs s) ss t
141 | R res t := f sigs t
143 | let _ # t := freeSigset1 sigs t
145 | _ # t := freeSigset1 sigs t
153 | record SSiginfoT (s : Type) where
159 | SiginfoT = SSiginfoT World
162 | Struct SSiginfoT where
167 | SizeOf (SSiginfoT s) where
168 | sizeof_ = siginfo_t_size
171 | record Siginfo where
180 | %runElab derive "Siginfo" [Show,Eq]
183 | siginfo : SSiginfoT s -> F1 s Siginfo
185 | let sig # t := ffi (get_siginfo_t_si_signo p) t
186 | cod # t := ffi (get_siginfo_t_si_code p) t
187 | pid # t := ffi (get_siginfo_t_si_pid p) t
188 | uid # t := ffi (get_siginfo_t_si_uid p) t
189 | stt # t := ffi (get_siginfo_t_si_status p) t
190 | val # t := ffi (get_siginfo_t_si_value p) t
191 | in SI (S sig) cod pid uid stt val # t
193 | export %inline %hint
194 | convertSiginfo : Convert Siginfo
195 | convertSiginfo = convStruct SSiginfoT siginfo