1.0.26.16: fix gencgc on ppc
[sbcl.git] / src / runtime / interrupt.h
index 1d9f64f..0c3984e 100644 (file)
 /* FIXME: do not rely on NSIG being a multiple of 8 */
 #define REAL_SIGSET_SIZE_BYTES ((NSIG/8))
 
+static inline void
+sigcopyset(sigset_t *new, sigset_t *old)
+{
+    memcpy(new, old, REAL_SIGSET_SIZE_BYTES);
+}
+
+extern void get_current_sigmask(sigset_t *sigset);
+
 /* Set all deferrable signals into *s. */
 extern void sigaddset_deferrable(sigset_t *s);
 /* Set all blockable signals into *s. */
@@ -37,25 +45,27 @@ 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_p(sigset_t *sigset);
+extern boolean blockables_blocked_p(sigset_t *sigset);
+extern boolean gc_signals_blocked_p(sigset_t *sigset);
 
-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 check_deferrables_blocked_or_lose(sigset_t *sigset);
+extern void check_blockables_blocked_or_lose(sigset_t *sigset);
+extern void check_gc_signals_blocked_or_lose(sigset_t *sigset);
 
-extern void maybe_save_gc_mask_and_block_deferrables(sigset_t *sigset);
+extern void check_deferrables_unblocked_or_lose(sigset_t *sigset);
+extern void check_blockables_unblocked_or_lose(sigset_t *sigset);
+extern void check_gc_signals_unblocked_or_lose(sigset_t *sigset);
 
-static inline void
-sigcopyset(sigset_t *new, sigset_t *old)
-{
-    memcpy(new, old, REAL_SIGSET_SIZE_BYTES);
-}
+extern void block_deferrable_signals(sigset_t *where, sigset_t *old);
+extern void block_blockable_signals(sigset_t *where, sigset_t *old);
+extern void block_gc_signals(sigset_t *where, sigset_t *old);
+
+extern void unblock_deferrable_signals(sigset_t *where, sigset_t *old);
+extern void unblock_blockable_signals(sigset_t *where, sigset_t *old);
+extern void unblock_gc_signals(sigset_t *where, sigset_t *old);
+
+extern void maybe_save_gc_mask_and_block_deferrables(sigset_t *sigset);
 
 /* maximum signal nesting depth
  *
@@ -103,6 +113,14 @@ struct interrupt_data {
      * NIL. Both deferrable interrupt handlers and gc are careful not
      * to clobber each other's pending_mask. */
     boolean gc_blocked_deferrables;
+#ifdef LISP_FEATURE_PPC
+    /* On PPC when consing wants to turn to alloc(), it does so via a
+     * trap. When alloc() wants to save the sigmask it consults
+     * allocation_trap_context. It does not look up the most recent
+     * context, because alloc() can be called from other places
+     * too. */
+    os_context_t *allocation_trap_context;
+#endif
 };
 
 extern boolean interrupt_handler_pending_p(void);