X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Finterrupt.h;h=325723f740787a79d9f84987a8424df15429e9b0;hb=816c50a5589bcf756f67119e657ae348e4858357;hp=e2b24c1f20d4812a13cf86e076eef850cf8500d3;hpb=4f9b5cd4268d3e28ac54748c4871e07f38acfd4c;p=sbcl.git diff --git a/src/runtime/interrupt.h b/src/runtime/interrupt.h index e2b24c1..325723f 100644 --- a/src/runtime/interrupt.h +++ b/src/runtime/interrupt.h @@ -37,15 +37,20 @@ extern sigset_t deferrable_sigset; extern sigset_t blockable_sigset; extern sigset_t gc_sigset; +extern void block_deferrable_signals(void); extern void block_blockable_signals(void); extern void unblock_deferrable_signals(void); extern void unblock_gc_signals(void); +extern void unblock_signals_in_context_and_maybe_warn(os_context_t *context); +extern boolean deferrables_blocked_in_sigset_p(sigset_t *sigset); extern void check_deferrables_blocked_or_lose(void); extern void check_blockables_blocked_or_lose(void); extern void check_gc_signals_unblocked_or_lose(void); extern void check_gc_signals_unblocked_in_sigset_or_lose(sigset_t *sigset); +extern void maybe_save_gc_mask_and_block_deferrables(sigset_t *sigset); + static inline void sigcopyset(sigset_t *new, sigset_t *old) { @@ -93,6 +98,11 @@ struct interrupt_data { int pending_signal; siginfo_t pending_info; sigset_t pending_mask; + /* Was pending mask saved for gc request? True if GC_PENDING or + * SIG_STOP_FOR_GC happened in a pseudo atomic with no GC_INHIBIT + * NIL. Both deferrable interrupt handlers and gc are careful not + * to clobber each other's pending_mask. */ + boolean gc_blocked_deferrables; }; extern boolean interrupt_handler_pending_p(void);