From a66d58d6b5f565386ee5c29b0f48883102c3cee1 Mon Sep 17 00:00:00 2001 From: Juan Jose Garcia Ripoll Date: Wed, 7 Oct 2009 15:39:23 +0200 Subject: [PATCH] When returning from a signal handler, ECL left a sigmask in which all signals were allowed. Now we just restore the default sigmask. --- src/c/unixint.d | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/c/unixint.d b/src/c/unixint.d index 293c7663a..186da7df2 100644 --- a/src/c/unixint.d +++ b/src/c/unixint.d @@ -220,9 +220,9 @@ mysignal(int code, void (*handler)(int, siginfo_t *, void*)) # endif #else new_action.sa_handler = handler; - sigfillset(&new_action.sa_mask); new_action.sa_flags = 0; #endif + sigfillset(&new_action.sa_mask); sigaction(code, &new_action, &old_action); } #else /* HAVE_SIGPROCMASK */ @@ -357,16 +357,14 @@ handler_fn_protype(lisp_signal_handler, int sig, siginfo_t *info, void *aux) static void unblock_signal(int signal) { - struct sigaction oact; - sigset_t block_mask; - sigaction(signal, NULL, &oact); - block_mask = oact.sa_mask; - sigaddset(&block_mask, signal); - sigdelset(&block_mask, cl_core.default_sigmask); + /* + * We do not really "unblock" the signal, but rather restore + * ECL's default sigmask. + */ # ifdef ECL_THREADS - pthread_sigmask(SIG_UNBLOCK, &block_mask, NULL); + pthread_sigmask(SIG_SETMASK, cl_core.default_sigmask, NULL); # else - sigprocmask(SIG_UNBLOCK, &block_mask, NULL); + sigprocmask(SIG_SETMASK, cl_core.default_sigmaks, NULL); # endif } #endif