0 | module System.Posix.Signal.Prim
5 | import public Data.C.Integer
6 | import public Data.C.Struct
7 | import public System.Posix.Errno
8 | import public System.Posix.Signal.Struct
9 | import public System.Posix.Signal.Types
17 | %foreign "C:li_kill, posix-idris"
18 | prim__kill : PidT -> Bits32 -> PrimIO CInt
20 | %foreign "C:raise, posix-idris"
21 | prim__raise : Bits32 -> PrimIO ()
23 | %foreign "C:li_sigprocmask1, posix-idris"
24 | prim__sigprocmask1 : Bits8 -> AnyPtr -> PrimIO ()
26 | %foreign "C:li_sigprocmask, posix-idris"
27 | prim__sigprocmask : Bits8 -> AnyPtr -> PrimIO AnyPtr
29 | %foreign "C:li_siggetprocmask, posix-idris"
30 | prim__siggetprocmask : PrimIO AnyPtr
32 | %foreign "C:li_sigpending, posix-idris"
33 | prim__sigpending : PrimIO AnyPtr
35 | %foreign "C:li_sigqueue, posix-idris"
36 | prim__sigqueue : PidT -> Bits32 -> CInt -> PrimIO CInt
38 | %foreign "C:li_pause, posix-idris"
39 | prim__pause : PrimIO CInt
41 | %foreign "C:li_sigsuspend, posix-idris"
42 | prim__sigsuspend : AnyPtr -> PrimIO CInt
44 | %foreign "C:li_sigwaitinfo, posix-idris"
45 | prim__sigwaitinfo : AnyPtr -> AnyPtr -> PrimIO CInt
47 | %foreign "C:li_sigtimedwait, posix-idris"
48 | prim__sigtimedwait : AnyPtr -> AnyPtr -> TimeT -> NsecT -> PrimIO CInt
50 | %foreign "C:li_sigwait, posix-idris"
51 | prim__sigwait : AnyPtr -> PrimIO CInt
59 | kill : PidT -> Signal -> EPrim ()
60 | kill p s = toUnit $
prim__kill p s.sig
64 | raise : Signal -> PrimIO ()
65 | raise s = prim__raise s.sig
71 | sigqueue : PidT -> Signal -> (word : CInt) -> EPrim ()
72 | sigqueue p s word = toUnit $
prim__sigqueue p s.sig word
83 | sigprocmask_ : How -> SigsetT -> PrimIO SigsetT
84 | sigprocmask_ h p w =
85 | let MkIORes p2 w := prim__sigprocmask (howCode h) (unwrap p) w
86 | in MkIORes (wrap p2) w
92 | export %foreign "C:abort, posix-idris"
99 | let r # t := toF1 (primMap fromNeg prim__pause) t
100 | in if r == EINTR then R () t else E (inject r) t
106 | sigsuspend_ : (set : SigsetT) -> EPrim ()
108 | let r # t := toF1 (primMap fromNeg (prim__sigsuspend $
unwrap s)) t
109 | in if r == EINTR then R () t else E (inject r) t
116 | sigwaitinfo_ : (set : SigsetT) -> (info : SiginfoT) -> EPrim ()
117 | sigwaitinfo_ s i = toUnit $
prim__sigwaitinfo (unwrap s) (unwrap i)
123 | sigwait_ : (set : SigsetT) -> EPrim Signal
124 | sigwait_ s = toVal (S . cast) $
prim__sigwait (unwrap s)
131 | -> (info : SiginfoT)
135 | sigtimedwait s i sec nsec =
136 | toUnit $
prim__sigtimedwait (unwrap s) (unwrap i) sec nsec
145 | sigprocmask : How -> List Signal -> EPrim ()
147 | withSignals ss $
\p,t =>
148 | let _ # t := toF1 (prim__sigprocmask1 (howCode h) (unwrap p)) t
153 | siggetprocmask : PrimIO (List Signal)
155 | let MkIORes p w := prim__siggetprocmask w
156 | MkIORes ss w := primRun (getSignals (wrap p)) w
157 | MkIORes _ w := prim__free p w
162 | sigpending : PrimIO (List Signal)
164 | let MkIORes p w := prim__sigpending w
165 | MkIORes ss w := primRun (getSignals (wrap p)) w
166 | MkIORes _ w := prim__free p w
171 | sigsuspend : List Signal -> EPrim ()
172 | sigsuspend ss = withSignals ss sigsuspend_
176 | sigwait : List Signal -> EPrim Signal
177 | sigwait ss = withSignals ss sigwait_
181 | sigwaitinfo : List Signal -> EPrim Siginfo
183 | withSignals ss $
\set => withStruct SSiginfoT $
\si,t =>
184 | let R _ t := sigwaitinfo_ set si t | E x t => E x t
185 | r # t := siginfo si t