X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Finterrupt.h;h=325723f740787a79d9f84987a8424df15429e9b0;hb=816c50a5589bcf756f67119e657ae348e4858357;hp=210579b7a08d50c685da8afddabdb78b4315f895;hpb=409fcc671231b594ec010adf683f72a871ec1d6a;p=sbcl.git diff --git a/src/runtime/interrupt.h b/src/runtime/interrupt.h index 210579b..325723f 100644 --- a/src/runtime/interrupt.h +++ b/src/runtime/interrupt.h @@ -26,13 +26,30 @@ /* FIXME: do not rely on NSIG being a multiple of 8 */ #define REAL_SIGSET_SIZE_BYTES ((NSIG/8)) +/* Set all deferrable signals into *s. */ +extern void sigaddset_deferrable(sigset_t *s); +/* Set all blockable signals into *s. */ +extern void sigaddset_blockable(sigset_t *s); +/* Set all gc signals into *s. */ +extern void sigaddset_gc(sigset_t *s); + 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 unblock_gc_signals(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) @@ -81,9 +98,14 @@ 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); extern void interrupt_init(void); extern void fake_foreign_function_call(os_context_t* context); extern void undo_fake_foreign_function_call(os_context_t* context); @@ -113,14 +135,6 @@ extern unsigned long install_handler(int signal, extern union interrupt_handler interrupt_handlers[NSIG]; -/* Set all deferrable signals into *s. */ -extern void sigaddset_deferrable(sigset_t *s); -/* Set all blockable signals into *s. */ -extern void sigaddset_blockable(sigset_t *s); - -extern void block_blockable_signals(void); -extern void unblock_deferrable_signals(void); - /* The void* casting here avoids having to mess with the various types * of function argument lists possible for signal handlers: * SA_SIGACTION handlers have one signature, and the default old-style