Move DONT_REOPEN_PTY from src/s to configure
[bpt/emacs.git] / src / syssignal.h
CommitLineData
9ab9afa9 1/* syssignal.h - System-dependent definitions for signals.
99cf43f9
GM
2
3Copyright (C) 1993, 1999, 2001-2012 Free Software Foundation, Inc.
9ab9afa9
JB
4
5This file is part of GNU Emacs.
6
b9b1cc14 7GNU Emacs is free software: you can redistribute it and/or modify
9ab9afa9 8it under the terms of the GNU General Public License as published by
b9b1cc14
GM
9the Free Software Foundation, either version 3 of the License, or
10(at your option) any later version.
9ab9afa9
JB
11
12GNU Emacs is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
b9b1cc14 18along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
9ab9afa9 19
383e0970 20extern void init_signals (void);
2b98b088 21
ae9e757a 22#ifdef HAVE_PTHREAD
333f1b6f 23#include <pthread.h>
f8240abd
YM
24/* If defined, asynchronous signals delivered to a non-main thread are
25 forwarded to the main thread. */
26#define FORWARD_SIGNAL_TO_MAIN_THREAD
27#endif
28
c3aa5fec 29/* Don't #include <signal.h>. That header should always be #included
cf026b25
JB
30 before "config.h", because some configuration files (like s/hpux.h)
31 indicate that SIGIO doesn't work by #undef-ing SIGIO. If this file
32 #includes <signal.h>, then that will re-#define SIGIO and confuse
33 things. */
4d553a13 34/* XXX This is not correct anymore, there is a BROKEN_SIGIO macro. */
00eaaa32 35
9ab9afa9
JB
36#define SIGMASKTYPE sigset_t
37
38#define SIGEMPTYMASK (empty_mask)
1fa53021 39extern sigset_t empty_mask;
9ab9afa9 40
1b1f8f85 41/* POSIX pretty much destroys any possibility of writing sigmask as a
47b682b7 42 macro in standard C. We always define our own version because the
da6062e6 43 predefined macro in Glibc 2.1 is only provided for compatibility for old
47b682b7
AS
44 programs that use int as signal mask type. */
45#undef sigmask
1b1f8f85
JB
46#ifdef __GNUC__
47#define sigmask(SIG) \
48 ({ \
49 sigset_t _mask; \
50 sigemptyset (&_mask); \
51 sigaddset (&_mask, SIG); \
52 _mask; \
53 })
985a35a3 54#else /* ! defined (__GNUC__) */
9bd67a37 55extern sigset_t sys_sigmask ();
1b1f8f85 56#define sigmask(SIG) (sys_sigmask (SIG))
985a35a3 57#endif /* ! defined (__GNUC__) */
1b1f8f85 58
47b682b7
AS
59#undef sigpause
60#define sigpause(MASK) sigsuspend (&(MASK))
9f910b50 61
69037d5a
RS
62#define sigblock(SIG) sys_sigblock (SIG)
63#define sigunblock(SIG) sys_sigunblock (SIG)
cc210d67 64#ifndef sigsetmask
69037d5a 65#define sigsetmask(SIG) sys_sigsetmask (SIG)
cc210d67 66#endif
6c8a1e24 67#undef signal
9c063f29 68#define signal(SIG,ACT) sys_signal(SIG,ACT)
9ab9afa9 69
ae877222
DN
70/* Whether this is what all systems want or not, this is what
71 appears to be assumed in the source, for example data.c:arith_error. */
9af30bdf 72typedef void (*signal_handler_t) (int);
ae877222 73
383e0970
J
74signal_handler_t sys_signal (int signal_number, signal_handler_t action);
75sigset_t sys_sigblock (sigset_t new_mask);
76sigset_t sys_sigunblock (sigset_t new_mask);
77sigset_t sys_sigsetmask (sigset_t new_mask);
5d4cb038 78#if ! (defined TIOCNOTTY || defined USG5 || defined CYGWIN)
845ca893 79_Noreturn void croak (char *);
5d4cb038 80#endif
9ab9afa9 81
69037d5a 82#define sys_sigdel(MASK,SIG) sigdelset (&MASK,SIG)
9ab9afa9 83
1b1f8f85 84#define sigfree() sigsetmask (SIGEMPTYMASK)
1b1f8f85 85
68c45bf0 86#if defined (SIGIO) && defined (BROKEN_SIGIO)
098767d9 87# undef SIGIO
68c45bf0 88#endif
99cf43f9 89/* Last user: m/ibmrs6000.h */
68c45bf0
PE
90#if defined (SIGPOLL) && defined (BROKEN_SIGPOLL)
91#undef SIGPOLL
92#endif
99cf43f9 93/* Last user: m/ibmrs6000.h */
4e677396
KH
94#if defined (SIGAIO) && defined (BROKEN_SIGAIO)
95#undef SIGAIO
96#endif
99cf43f9 97/* Last user: m/ibmrs6000.h */
4e677396
KH
98#if defined (SIGPTY) && defined (BROKEN_SIGPTY)
99#undef SIGPTY
100#endif
101
68c45bf0
PE
102
103#if NSIG < NSIG_MINIMUM
104# ifdef NSIG
105# undef NSIG
106# endif
107# define NSIG NSIG_MINIMUM
108#endif
109
9ab9afa9
JB
110/* On bsd, [man says] kill does not accept a negative number to kill a pgrp.
111 Must do that using the killpg call. */
6df54671 112#ifdef BSD_SYSTEM
9ab9afa9
JB
113#define EMACS_KILLPG(gid, signo) (killpg ( (gid), (signo)))
114#else
57d65592 115#ifdef WINDOWSNT
f405affb 116#define EMACS_KILLPG(gid, signo) (kill (gid, signo))
57d65592 117#else
9ab9afa9
JB
118#define EMACS_KILLPG(gid, signo) (kill (-(gid), (signo)))
119#endif
57d65592 120#endif
9ab9afa9
JB
121
122/* Define SIGCHLD as an alias for SIGCLD. There are many conditionals
123 testing SIGCHLD. */
9ab9afa9
JB
124#ifdef SIGCLD
125#ifndef SIGCHLD
126#define SIGCHLD SIGCLD
985a35a3
JB
127#endif /* SIGCHLD */
128#endif /* ! defined (SIGCLD) */
68c45bf0
PE
129
130#ifndef HAVE_STRSIGNAL
131/* strsignal is in sysdep.c */
361358ea 132char *strsignal (int);
68c45bf0 133#endif
ab5796a9 134
f8240abd 135#ifdef FORWARD_SIGNAL_TO_MAIN_THREAD
dff94ed5 136extern pthread_t main_thread;
333f1b6f
JD
137#define SIGNAL_THREAD_CHECK(signo) \
138 do { \
3fb8b536 139 if (!pthread_equal (pthread_self (), main_thread)) \
333f1b6f
JD
140 { \
141 /* POSIX says any thread can receive the signal. On GNU/Linux \
142 that is not true, but for other systems (FreeBSD at least) \
143 it is. So direct the signal to the correct thread and block \
144 it from this thread. */ \
145 sigset_t new_mask; \
146 \
147 sigemptyset (&new_mask); \
148 sigaddset (&new_mask, signo); \
149 pthread_sigmask (SIG_BLOCK, &new_mask, 0); \
150 pthread_kill (main_thread, signo); \
151 return; \
152 } \
153 } while (0)
154
f8240abd 155#else /* not FORWARD_SIGNAL_TO_MAIN_THREAD */
333f1b6f 156#define SIGNAL_THREAD_CHECK(signo)
f8240abd 157#endif /* not FORWARD_SIGNAL_TO_MAIN_THREAD */