summaryrefslogtreecommitdiffstats
path: root/signal.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2013-12-13 08:01:56 -0800
committerKaz Kylheku <kaz@kylheku.com>2013-12-13 08:01:56 -0800
commita846f5e378a1c03ae122c711308899bbe381a7f1 (patch)
tree85fee1fdaf1f2a0f397fbbd6a61619e13454ac03 /signal.c
parentbdd1a3fa274078dd37da6df64bb93b3b183fa7cb (diff)
downloadtxr-a846f5e378a1c03ae122c711308899bbe381a7f1.tar.gz
txr-a846f5e378a1c03ae122c711308899bbe381a7f1.tar.bz2
txr-a846f5e378a1c03ae122c711308899bbe381a7f1.zip
* signal.c (set_sig_handler): Disable signals around this
function because it manipulates the mask of deferred signals which can also be manipulated by an async signal.
Diffstat (limited to 'signal.c')
-rw-r--r--signal.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/signal.c b/signal.c
index c833131b..4a089caf 100644
--- a/signal.c
+++ b/signal.c
@@ -130,6 +130,10 @@ val set_sig_handler(val signo, val lambda)
{
cnum sig = c_num(signo);
val old_lambda;
+ sigset_t block, saved;
+
+ sigfillset(&block);
+ sigprocmask(SIG_BLOCK, &block, &saved);
if (sig < 0 || sig >= MAX_SIG)
uw_throwf(error_s, lit("set-sig-handler: signal ~s out of range\n"), sig, nao);
@@ -159,6 +163,8 @@ val set_sig_handler(val signo, val lambda)
sig_lambda[sig] = lambda;
}
+ sigprocmask(SIG_SETMASK, &saved, 0);
+
return old_lambda;
}