X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Finterrupt.c;h=4860be2704923e6b186cc2e4873602b12c7d6476;hb=de0a47a2f2b165f34177669bd9499135847b4897;hp=6824f3b9b9a6c3fc75e921714856dbc95c0ca424;hpb=4a3c4dc2899b799cbfa4f76dfc80123dc855f281;p=sbcl.git diff --git a/src/runtime/interrupt.c b/src/runtime/interrupt.c index 6824f3b..4860be2 100644 --- a/src/runtime/interrupt.c +++ b/src/runtime/interrupt.c @@ -63,6 +63,7 @@ #include "alloc.h" #include "dynbind.h" #include "interr.h" +#include "pseudo-atomic.h" #include "genesis/fdefn.h" #include "genesis/simple-fun.h" #include "genesis/cons.h" @@ -74,6 +75,15 @@ static void store_signal_data_for_later (struct interrupt_data *data, siginfo_t *info, os_context_t *context); +static void +fill_current_sigmask(sigset_t *sigset) +{ + /* Get the current sigmask, by blocking the empty set. */ + sigset_t empty; + sigemptyset(&empty); + thread_sigmask(SIG_BLOCK, &empty, sigset); +} + void sigaddset_deferrable(sigset_t *s) { @@ -123,6 +133,28 @@ sigset_t blockable_sigset; #endif void +check_deferrables_blocked_in_sigset_or_lose(sigset_t *sigset) +{ +#if !defined(LISP_FEATURE_WIN32) + int i; + for(i = 1; i < NSIG; i++) { + if (sigismember(&deferrable_sigset, i) && !sigismember(sigset, i)) + lose("deferrable signal %d not blocked\n",i); + } +#endif +} + +void +check_deferrables_blocked_or_lose(void) +{ +#if !defined(LISP_FEATURE_WIN32) + sigset_t current; + fill_current_sigmask(¤t); + check_deferrables_blocked_in_sigset_or_lose(¤t); +#endif +} + +void check_blockables_blocked_or_lose(void) { #if !defined(LISP_FEATURE_WIN32) @@ -407,14 +439,8 @@ interrupt_handle_pending(os_context_t *context) struct thread *thread; - /* Punt if in PA section, marking it as interrupted. This can - * happenat least if we pick up a GC request while in a - * WITHOUT-GCING with an outer PA -- it is not immediately clear - * to me that this should/could ever happen, but better safe then - * sorry. --NS 2007-05-15 */ if (arch_pseudo_atomic_atomic(context)) { - arch_set_pseudo_atomic_interrupted(context); - return; + lose("Handling pending interrupt in pseduo atomic."); } thread = arch_os_get_current_thread();