summaryrefslogtreecommitdiff
path: root/Src/signals.h
diff options
context:
space:
mode:
Diffstat (limited to 'Src/signals.h')
-rw-r--r--Src/signals.h35
1 files changed, 33 insertions, 2 deletions
diff --git a/Src/signals.h b/Src/signals.h
index b6485e6b3..45978dd1e 100644
--- a/Src/signals.h
+++ b/Src/signals.h
@@ -56,8 +56,8 @@
# define sigismember(s,n) ((*(s) & (1 << ((n) - 1))) != 0)
#endif /* ifndef POSIX_SIGNALS */
-#define child_block() signal_block(signal_mask(SIGCHLD))
-#define child_unblock() signal_unblock(signal_mask(SIGCHLD))
+#define child_block() signal_block(sigchld_mask)
+#define child_unblock() signal_unblock(sigchld_mask)
#define child_suspend(S) signal_suspend(SIGCHLD, S)
/* ignore a signal */
@@ -92,3 +92,34 @@
} \
} \
} while (0)
+
+
+/* Make some signal functions faster. */
+
+#ifdef POSIX_SIGNALS
+#define signal_block(S) \
+ ((dummy_sigset1 = (S)), \
+ sigprocmask(SIG_BLOCK, &dummy_sigset1, &dummy_sigset2), \
+ dummy_sigset2)
+#else
+# ifdef BSD_SIGNALS
+#define signal_block(S) sigblock(S)
+# else
+extern sigset_t signal_block _((sigset_t));
+# endif /* BSD_SIGNALS */
+#endif /* POSIX_SIGNALS */
+
+#ifdef POSIX_SIGNALS
+#define signal_unblock(S) \
+ ((dummy_sigset1 = (S)), \
+ sigprocmask(SIG_UNBLOCK, &dummy_sigset1, &dummy_sigset2), \
+ dummy_sigset2)
+#else
+extern sigset_t signal_unblock _((sigset_t));
+#endif /* POSIX_SIGNALS */
+
+#define RUNTRAPS() do { if (trapqused) doqueuedtraps(); } while (0)
+#define ALLOWTRAPS do { RUNTRAPS(); trapsallowed++; do
+#define DISALLOWTRAPS while (0); RUNTRAPS(); trapsallowed--; } while (0)
+#define ALLOWTRAPS_RETURN(V) \
+ do { RUNTRAPS(); trapsallowed--; return (V); } while (0)