|
3 | 3 | package runtime |
4 | 4 |
|
5 | 5 | import ( |
| 6 | + "syscall" |
6 | 7 | "unsafe" |
7 | 8 | ) |
8 | 9 |
|
@@ -262,23 +263,45 @@ func init() { |
262 | 263 | // A channel size of 1 should be sufficient in most cases, but using 4 just |
263 | 264 | // to be sure. |
264 | 265 | signalChan = make(chan uint32, 4) |
| 266 | + signalIgnored = make([]bool, 65) // 65 is the highest signal number we support |
265 | 267 | } |
266 | 268 |
|
267 | 269 | var signalChan chan uint32 |
| 270 | +var signalIgnored []bool // TODO: replace with more efficient bitmap? |
268 | 271 |
|
269 | 272 | //go:linkname signal_enable os/signal.signal_enable |
270 | | -func signal_enable(s uint32) { |
| 273 | +func signal_enable(sig uint32) { |
271 | 274 | // It's easier to implement this function in C. |
272 | | - tinygo_signal_enable(s) |
| 275 | + tinygo_signal_enable(sig) |
273 | 276 | } |
274 | 277 |
|
275 | 278 | //export tinygo_signal_enable |
276 | 279 | func tinygo_signal_enable(s uint32) |
277 | 280 |
|
| 281 | +func signal_disable(sig uint32) { |
| 282 | + tinygo_signal_disable(sig) |
| 283 | +} |
| 284 | + |
| 285 | +//export tinygo_signal_disable |
| 286 | +func tinygo_signal_disable(sig uint32) |
| 287 | + |
| 288 | +// Ignore the given signal by adding it into the signalIgnored array. |
| 289 | +// If the signal is received, it will be ignored in the tinygo_signal_handler. |
| 290 | +// The signals SIGKILL and SIGSTOP cannot be caught or ignored. man (2) signal |
| 291 | +func tinygo_signal_ignore(sig uint32) { |
| 292 | + if syscall.Signal(sig) != syscall.SIGKILL && syscall.Signal(sig) != syscall.SIGSTOP { |
| 293 | + signalIgnored[sig] = true |
| 294 | + } |
| 295 | +} |
| 296 | + |
278 | 297 | // void tinygo_signal_handler(int sig); |
279 | 298 | // |
280 | 299 | //export tinygo_signal_handler |
281 | 300 | func tinygo_signal_handler(s int32) { |
| 301 | + if signalIgnored[s] { |
| 302 | + return |
| 303 | + } |
| 304 | + |
282 | 305 | select { |
283 | 306 | case signalChan <- uint32(s): |
284 | 307 | default: |
|
0 commit comments