summaryrefslogtreecommitdiff
path: root/src/emacssignal.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/emacssignal.h')
-rw-r--r--src/emacssignal.h57
1 files changed, 57 insertions, 0 deletions
diff --git a/src/emacssignal.h b/src/emacssignal.h
new file mode 100644
index 00000000000..f65a7bb53da
--- /dev/null
+++ b/src/emacssignal.h
@@ -0,0 +1,57 @@
+#ifdef POSIX_SIGNALS
+
+#define SIGMASKTYPE sigset_t
+#define SIGEMPTYMASK (signal_empty_mask)
+#define SIGFULLMASK (signal_full_mask)
+extern sigset_t signal_empty_mask, signal_full_mask;
+
+#ifdef sigmask
+#undef sigmask
+#endif
+#define sigmask(SIG) \
+(_mask = SIGEMPTYMASK, sigaddset (&_mask, SIG), _mask)
+
+/* Local mask is used to avoid problems if code using any of the macros
+ below could be reentered due to a signal occurring.
+ This can't happen in Emacs 18.58, but just to be safe... - DJB
+ These macros require GCC. */
+#define sigpause(SIG) ({ sigset_t _mask; sys_sigpause(SIG); })
+#define sigblock(SIG) ({ sigset_t _mask; sys_sigblock(SIG); })
+#define sigunblock(SIG) ({ sigset_t _mask; sys_sigunblock(SIG); })
+#define sigsetmask(SIG) ({ sigset_t _mask; sys_sigsetmask(SIG); })
+#define sighold(SIG) ONLY_USED_IN_BSD_4_1
+#define sigrelse(SIG) ONLY_USED_IN_BSD_4_1
+
+int (*sys_signal (int signal_number, int (*action)())) ();
+int sys_sigpause (sigset_t new_mask);
+sigset_t sys_sigblock (sigset_t new_mask);
+sigset_t sys_sigunblock (sigset_t new_mask);
+sigset_t sys_sigsetmask (sigset_t new_mask);
+
+#define sys_sigdel(MASK,SIG) sigdelset(&MASK,SIG)
+#endif /* POSIX_SIGNALS */
+
+#ifndef SIGMASKTYPE
+#define SIGMASKTYPE int
+#endif
+
+#ifndef SIGEMPTYMASK
+#define SIGEMPTYMASK 0
+#endif
+
+#ifndef SIGFULLMASK
+#define SIGFULLMASK 0xffffffff
+#endif
+
+#ifndef sigmask
+#define sigmask(no) (1L << ((no) - 1))
+#endif
+
+#ifndef sigunblock
+#define sigunblock(SIG) \
+{ SIGMASKTYPE omask = sigblock (SIGFULLMASK); sigsetmask (omask & ~SIG); }
+#endif
+
+#ifndef sys_sigdel
+#define sys_sigdel(MASK,SIG) MASK &= ~(1 << SIG)
+#endif