diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2014-08-02 09:37:24 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2014-08-02 09:37:24 -0700 |
commit | 73a7ae605d364be49dc5bd1cc15c1116fe47a446 (patch) | |
tree | 752c37f24563565c8589cbacb05492df003b709c /signal.c | |
parent | 404e5c4091c607a39d28b651063da9bdc7ebb3bb (diff) | |
download | txr-73a7ae605d364be49dc5bd1cc15c1116fe47a446.tar.gz txr-73a7ae605d364be49dc5bd1cc15c1116fe47a446.tar.bz2 txr-73a7ae605d364be49dc5bd1cc15c1116fe47a446.zip |
* signal.c (interrupt_count): New global variable.
(sig_handler): Increment and decrement interrupt count.
If the interrupt count is already positive, treat
that as if async signals were not enabled: do not
invoke handlers.
Diffstat (limited to 'signal.c')
-rw-r--r-- | signal.c | 6 |
1 files changed, 5 insertions, 1 deletions
@@ -46,6 +46,7 @@ #define MAX_SIG 32 volatile sig_atomic_t async_sig_enabled = 0; +static volatile sig_atomic_t interrupt_count = 0; sigset_t sig_blocked_cache; static val sig_lambda[MAX_SIG]; @@ -69,6 +70,7 @@ static void sig_handler(int sig) int gc = 0; int as = 0; int exc = is_cpu_exception(sig); + int in_interrupt = interrupt_count++ > 0; if (exc) { gc = gc_state(0); @@ -77,7 +79,7 @@ static void sig_handler(int sig) } if (lambda) { - if (async_sig_enabled) { + if (!in_interrupt && async_sig_enabled) { async_sig_enabled = 0; if (funcall2(lambda, num_fast(sig), t)) sig_deferred |= (1UL << sig); @@ -91,6 +93,8 @@ static void sig_handler(int sig) async_sig_enabled = as; gc_state(gc); } + + interrupt_count--; } static val kill_wrap(val pid, val sig) |