diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2013-12-13 08:01:56 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2013-12-13 08:01:56 -0800 |
commit | a846f5e378a1c03ae122c711308899bbe381a7f1 (patch) | |
tree | 85fee1fdaf1f2a0f397fbbd6a61619e13454ac03 /signal.c | |
parent | bdd1a3fa274078dd37da6df64bb93b3b183fa7cb (diff) | |
download | txr-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.c | 6 |
1 files changed, 6 insertions, 0 deletions
@@ -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; } |