15 | signalFFI : String -> String
16 | signalFFI fn = "C:" ++ fn ++ ", libidris2_support, idris_signal.h"
18 | signalFFINode : String -> String
19 | signalFFINode fn = "node:support:" ++ fn ++ ",support_system_signal"
24 | %foreign signalFFI "sighup"
25 | signalFFINode "sighup"
28 | %foreign signalFFI "sigint"
29 | signalFFINode "sigint"
32 | %foreign signalFFI "sigabrt"
33 | signalFFINode "sigabrt"
36 | %foreign signalFFI "sigquit"
37 | signalFFINode "sigquit"
40 | %foreign signalFFI "sigill"
41 | signalFFINode "sigill"
44 | %foreign signalFFI "sigsegv"
45 | signalFFINode "sigsegv"
48 | %foreign signalFFI "sigtrap"
49 | signalFFINode "sigtrap"
52 | %foreign signalFFI "sigfpe"
53 | signalFFINode "sigfpe"
56 | %foreign signalFFI "sigusr1"
57 | signalFFINode "sigusr1"
60 | %foreign signalFFI "sigusr2"
61 | signalFFINode "sigusr2"
75 | Eq PosixSignal where
76 | SigHUP == SigHUP = True
77 | SigQUIT == SigQUIT = True
78 | SigTRAP == SigTRAP = True
79 | SigUser1 == SigUser1 = True
80 | SigUser2 == SigUser2 = True
95 | SigPosix PosixSignal
99 | SigINT == SigINT = True
100 | SigABRT == SigABRT = True
101 | SigILL == SigILL = True
102 | SigSEGV == SigSEGV = True
103 | SigFPE == SigFPE = True
104 | SigPosix x == SigPosix y = x == y
110 | signalCode : Signal -> Int
111 | signalCode SigINT = prim__sigint
112 | signalCode SigABRT = prim__sigabrt
113 | signalCode SigILL = prim__sigill
114 | signalCode SigSEGV = prim__sigsegv
115 | signalCode SigFPE = prim__sigfpe
116 | signalCode (SigPosix SigHUP ) = prim__sighup
117 | signalCode (SigPosix SigQUIT ) = prim__sigquit
118 | signalCode (SigPosix SigTRAP ) = prim__sigtrap
119 | signalCode (SigPosix SigUser1) = prim__sigusr1
120 | signalCode (SigPosix SigUser2) = prim__sigusr2
124 | toSignal : Int -> Maybe Signal
125 | toSignal (-
1) = Nothing
126 | toSignal x = lookup x codes
128 | codes : List (Int, Signal)
130 | (prim__sigint , SigINT)
131 | , (prim__sigabrt, SigABRT)
132 | , (prim__sigill , SigILL)
133 | , (prim__sigsegv, SigSEGV)
134 | , (prim__sigfpe , SigFPE)
135 | , (prim__sighup , SigPosix SigHUP)
136 | , (prim__sigquit, SigPosix SigQUIT)
137 | , (prim__sigtrap, SigPosix SigTRAP)
138 | , (prim__sigusr1, SigPosix SigUser1)
139 | , (prim__sigusr2, SigPosix SigUser2)
145 | %foreign signalFFI "ignore_signal"
146 | signalFFINode "ignoreSignal"
147 | prim__ignoreSignal : Int -> PrimIO Int
149 | %foreign signalFFI "default_signal"
150 | signalFFINode "defaultSignal"
151 | prim__defaultSignal : Int -> PrimIO Int
153 | %foreign signalFFI "collect_signal"
154 | signalFFINode "collectSignal"
155 | prim__collectSignal : Int -> PrimIO Int
157 | %foreign signalFFI "handle_next_collected_signal"
158 | signalFFINode "handleNextCollectedSignal"
159 | prim__handleNextCollectedSignal : PrimIO Int
161 | %foreign signalFFI "send_signal"
162 | signalFFINode "sendSignal"
163 | prim__sendSignal : Int -> Int -> PrimIO Int
165 | %foreign signalFFI "raise_signal"
166 | signalFFINode "raiseSignal"
167 | prim__raiseSignal : Int -> PrimIO Int
173 | data SignalError = Error Int
175 | getError : HasIO io => io SignalError
176 | getError = Error <$> getErrno
178 | isError : Int -> Bool
179 | isError (-
1) = True
187 | ignoreSignal : HasIO io => Signal -> io (Either SignalError ())
188 | ignoreSignal sig = do
189 | res <- primIO $
prim__ignoreSignal (signalCode sig)
190 | case isError res of
191 | False => pure $
Right ()
192 | True => Left <$> getError
198 | defaultSignal : HasIO io => Signal -> io (Either SignalError ())
199 | defaultSignal sig = do
200 | res <- primIO $
prim__defaultSignal (signalCode sig)
201 | case isError res of
202 | False => pure $
Right ()
203 | True => Left <$> getError
219 | collectSignal : HasIO io => Signal -> io (Either SignalError ())
220 | collectSignal sig = do
221 | res <- primIO $
prim__collectSignal (signalCode sig)
222 | case isError res of
223 | False => pure $
Right ()
224 | True => Left <$> getError
234 | handleNextCollectedSignal : HasIO io => io (Maybe Signal)
235 | handleNextCollectedSignal =
236 | toSignal <$> primIO prim__handleNextCollectedSignal
244 | handleManyCollectedSignals : HasIO io => Fuel -> io (List Signal)
245 | handleManyCollectedSignals Dry = pure []
246 | handleManyCollectedSignals (More fuel) = do
247 | Just next <- handleNextCollectedSignal
248 | | Nothing => pure []
249 | pure $
next :: !(handleManyCollectedSignals fuel)
253 | raiseSignal : HasIO io => Signal -> io (Either SignalError ())
254 | raiseSignal sig = do
255 | res <- primIO $
prim__raiseSignal (signalCode sig)
256 | case isError res of
257 | False => pure $
Right ()
258 | True => Left <$> getError
263 | sendSignal : HasIO io => Signal -> (pid : Int) -> io (Either SignalError ())
264 | sendSignal sig pid = do
265 | res <- primIO $
prim__sendSignal pid (signalCode sig)
266 | case isError res of
267 | False => pure $
Right ()
268 | True => Left <$> getError