0 | module System.Linux.SignalFD
4 | import Derive.Prelude
6 | import System.Linux.Error
7 | import System.Linux.File
8 | import public System.Signal
11 | %language ElabReflection
17 | %foreign "C:ep_sfd_cloexec,epoll-idris"
18 | ep_sfd_cloexec : Bits32
20 | %foreign "C:ep_sfd_nonblock,epoll-idris"
21 | ep_sfd_nonblock : Bits32
23 | %foreign "C:ep_allocSignalset,epoll-idris"
24 | prim__allocSignalset : PrimIO AnyPtr
26 | %foreign "C:signalfd,epoll-idris"
27 | prim__signalfd : Int32 -> AnyPtr -> Bits32 -> PrimIO Bits32
29 | %foreign "C:ep_readSignal,epoll-idris"
30 | prim__ep_readSignal : Bits32 -> PrimIO Bits32
32 | %foreign "C:raise,epoll-idris"
33 | prim__raise : Bits32 -> PrimIO ()
35 | %foreign "C:ep_sigblock,epoll-idris"
36 | prim__sigblock : AnyPtr -> PrimIO ()
38 | %foreign "C:sigaddset,epoll-idris"
39 | prim__sigaddset : AnyPtr -> Bits32 -> PrimIO ()
45 | %runElab derive "PosixSignal" [Show,Finite]
47 | %runElab derive "Signal" [Show,Finite]
57 | %runElab derive "Flags" [Show,Eq,Ord]
60 | flagCode : Flags -> Bits32
64 | Semigroup Flags where
65 | F x <+> F y = F (x .|. y)
68 | Monoid Flags where neutral = F 0
72 | SFD_CLOEXEC = F ep_sfd_cloexec
81 | SFD_NONBLOCK : Flags
82 | SFD_NONBLOCK = F ep_sfd_nonblock
86 | record SignalFD where
91 | FileDesc SignalFD where fileDesc = file
93 | addSignals : List Signal -> AnyPtr -> PrimIO ()
94 | addSignals [] ptr w = MkIORes () w
95 | addSignals (x :: xs) ptr w =
96 | let MkIORes _ w := prim__sigaddset ptr (cast $
signalCode x) w
97 | in addSignals xs ptr w
106 | signalCreate : List Signal -> Flags -> PrimIO SignalFD
107 | signalCreate ss (F f) w =
108 | let MkIORes ptr w := prim__allocSignalset w
109 | MkIORes _ w := addSignals ss ptr w
110 | MkIORes file w := prim__signalfd (-
1) ptr f w
111 | MkIORes _ w := toPrim (free ptr) w
112 | in MkIORes (SFD file) w
116 | blockSignals : List Signal -> PrimIO ()
117 | blockSignals ss w =
118 | let MkIORes ptr w := prim__allocSignalset w
119 | MkIORes _ w := addSignals ss ptr w
120 | MkIORes _ w := prim__sigblock ptr w
121 | in toPrim (free ptr) w
125 | readSignal : SignalFD -> PrimIO (Either EpollErr Bits32)
126 | readSignal (SFD f) w =
127 | let MkIORes v w := prim__ep_readSignal f w
130 | n => MkIORes (Right n) w
134 | withSignal : List Signal -> Flags -> (SignalFD -> PrimIO a) -> PrimIO a
135 | withSignal ss fs f w =
136 | let MkIORes tf w := signalCreate ss fs w
137 | MkIORes res w := f tf w
138 | MkIORes _ w := close tf w
142 | raise : Signal -> PrimIO ()
143 | raise s = prim__raise (cast $
signalCode s)