diff --git a/examples/sigaction.janet b/examples/sigaction.janet index 9267baa9..36c59a7c 100644 --- a/examples/sigaction.janet +++ b/examples/sigaction.janet @@ -1,11 +1,41 @@ -(defn action [] - (print "cleanup") +### +### Usage: janet examples/sigaction.janet 1|2|3|4 & +### +### Then at shell: kill -s SIGTERM $! +### + +(defn action + [] + (print "Handled SIGTERM!") + (flush) (os/exit 1)) -(defn main [_] - # Set the interrupt-interpreter argument to `true` to allow - # interrupting the busy loop `(forever)`. By default, will not - # interrupt the interpreter. +(defn main1 + [] (os/sigaction :term action true) - (os/sigaction :int action true) (forever)) + +(defn main2 + [] + (os/sigaction :term action) + (forever)) + +(defn main3 + [] + (os/sigaction :term action true) + (forever (ev/sleep math/inf))) + +(defn main4 + [] + (os/sigaction :term action) + (forever (ev/sleep math/inf))) + +(defn main + [& args] + (def which (scan-number (get args 1 "1"))) + (case which + 1 (main1) # should work + 2 (main2) # will not work + 3 (main3) # should work + 4 (main4) # should work + (error "bad main"))) diff --git a/src/core/os.c b/src/core/os.c index 1f1cad35..2d0d7803 100644 --- a/src/core/os.c +++ b/src/core/os.c @@ -827,6 +827,7 @@ static void janet_signal_callback(JanetEVGenericMessage msg) { JanetFiber *fiber = janet_fiber(handler, 64, 0, NULL); janet_schedule(fiber, janet_wrap_nil()); if (msg.argi) { + janet_vm.auto_suspend = 0; /* Undo interrupt if it wasn't needed. */ janet_ev_dec_refcount(); } }