diff --git a/src/lisp/interrupt.c b/src/lisp/interrupt.c index de17cee10d244d285b0b0e21799427e46c9b58ba..b6332f59ba65c373a9da9957f48ab518114ba66e 100644 --- a/src/lisp/interrupt.c +++ b/src/lisp/interrupt.c @@ -169,6 +169,16 @@ interrupt_internal_error(HANDLER_ARGS, boolean continuable) arch_skip_instruction(context); } +static void +copy_sigmask(sigset_t *dst, sigset_t *src) +{ +#ifndef __linux__ + *dst = *src; +#else + memcpy(dst, src, NSIG / 8); +#endif +} + void interrupt_handle_pending(os_context_t * context) { @@ -190,11 +200,8 @@ interrupt_handle_pending(os_context_t * context) #endif undo_fake_foreign_function_call(context); } -#ifndef __linux__ - context->uc_sigmask = pending_mask; -#else - memcpy(&context->uc_sigmask, &pending_mask, NSIG / LONG_BIT); -#endif + + copy_sigmask(&context->uc_sigmask, &pending_mask); sigemptyset(&pending_mask); if (pending_signal) { @@ -300,7 +307,7 @@ setup_pending_signal(HANDLER_ARGS) * */ pending_code.si_code = CODE(code); - pending_mask = ucontext->uc_sigmask; + copy_sigmask(&pending_mask, &ucontext->uc_sigmask); FILLBLOCKSET(&ucontext->uc_sigmask); } @@ -372,11 +379,7 @@ interrupt_maybe_gc(HANDLER_ARGS) if (arch_pseudo_atomic_atomic(context)) { maybe_gc_pending = TRUE; if (pending_signal == 0) { -#ifndef __linux__ - pending_mask = context->uc_sigmask; -#else - memcpy(&pending_mask, &context->uc_sigmask, NSIG / LONG_BIT); -#endif + copy_sigmask(&pending_mask, &context->uc_sigmask); FILLBLOCKSET(&context->uc_sigmask); } arch_set_pseudo_atomic_interrupted(context);