From 1964bb94f82d3d81eec3d5797fe875741a9a8182 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Fri, 13 Dec 2013 08:13:49 -0800 Subject: * signal.c (sig_handler): Pass two arguments to signal handler rather than 1. The new argument is the value t, telling the handler that it's asynchronously invoked in a real signal context. If the signal handler returns true, then mark it deferred so that it can re-trigger in a synchronous context. (sig_check): Pass nil as a the second argument to signal handlers, indicating that they are synchronously called, not in a signal handler context. * txr.1: Added documentation. --- signal.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'signal.c') diff --git a/signal.c b/signal.c index 4a089caf..82f84149 100644 --- a/signal.c +++ b/signal.c @@ -59,7 +59,8 @@ static void sig_handler(int sig) if (lambda) { if (async_sig_enabled) { async_sig_enabled = 0; - funcall1(lambda, num_fast(sig)); + if (funcall2(lambda, num_fast(sig), t)) + sig_deferred |= (1UL << sig); async_sig_enabled = 1; } else { sig_deferred |= (1UL << sig); @@ -191,7 +192,7 @@ val sig_check(void) if ((sd & mask) != 0) { sd &= ~mask; sig_deferred = sd; - funcall1(sig_lambda[i], num_fast(i)); + funcall2(sig_lambda[i], num_fast(i), nil); } } -- cgit v1.2.3