1.0.25.43: alpha interrupt context fixes
[sbcl.git] / src / runtime / interrupt.h
index bf9fe42..325723f 100644 (file)
@@ -37,16 +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)
 {
@@ -94,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);