(scan_lists): Follow coding convention.
[bpt/emacs.git] / src / syssignal.h
CommitLineData
9ab9afa9 1/* syssignal.h - System-dependent definitions for signals.
429ab54e 2 Copyright (C) 1993, 1999, 2001, 2002, 2003, 2004,
8cabe764 3 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
9ab9afa9
JB
4
5This file is part of GNU Emacs.
6
7GNU Emacs is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
684d6f5b 9the Free Software Foundation; either version 3, or (at your option)
9ab9afa9
JB
10any later version.
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
18along with GNU Emacs; see the file COPYING. If not, write to
4fc5845f
LK
19the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20Boston, MA 02110-1301, USA. */
9ab9afa9 21
2b98b088
TTN
22extern void init_signals P_ ((void));
23
333f1b6f
JD
24#ifdef HAVE_GTK_AND_PTHREAD
25#include <pthread.h>
26extern pthread_t main_thread;
27#endif
28
9ab9afa9 29#ifdef POSIX_SIGNALS
00eaaa32 30
c3aa5fec 31/* Don't #include <signal.h>. That header should always be #included
cf026b25
JB
32 before "config.h", because some configuration files (like s/hpux.h)
33 indicate that SIGIO doesn't work by #undef-ing SIGIO. If this file
34 #includes <signal.h>, then that will re-#define SIGIO and confuse
35 things. */
4d553a13 36/* XXX This is not correct anymore, there is a BROKEN_SIGIO macro. */
00eaaa32 37
9ab9afa9
JB
38#define SIGMASKTYPE sigset_t
39
40#define SIGEMPTYMASK (empty_mask)
41#define SIGFULLMASK (full_mask)
47b682b7 42extern sigset_t empty_mask, full_mask;
9ab9afa9 43
1b1f8f85 44/* POSIX pretty much destroys any possibility of writing sigmask as a
47b682b7
AS
45 macro in standard C. We always define our own version because the
46 predefined macro in Glibc 2.1 is only provided for compatility for old
47 programs that use int as signal mask type. */
48#undef sigmask
1b1f8f85
JB
49#ifdef __GNUC__
50#define sigmask(SIG) \
51 ({ \
52 sigset_t _mask; \
53 sigemptyset (&_mask); \
54 sigaddset (&_mask, SIG); \
55 _mask; \
56 })
985a35a3 57#else /* ! defined (__GNUC__) */
9bd67a37 58extern sigset_t sys_sigmask ();
1b1f8f85 59#define sigmask(SIG) (sys_sigmask (SIG))
985a35a3 60#endif /* ! defined (__GNUC__) */
1b1f8f85 61
47b682b7
AS
62#undef sigpause
63#define sigpause(MASK) sigsuspend (&(MASK))
9f910b50 64
69037d5a
RS
65#define sigblock(SIG) sys_sigblock (SIG)
66#define sigunblock(SIG) sys_sigunblock (SIG)
cc210d67 67#ifndef sigsetmask
69037d5a 68#define sigsetmask(SIG) sys_sigsetmask (SIG)
cc210d67 69#endif
9ab9afa9
JB
70#define sighold(SIG) ONLY_USED_IN_BSD_4_1
71#define sigrelse(SIG) ONLY_USED_IN_BSD_4_1
6c8a1e24 72#undef signal
9c063f29 73#define signal(SIG,ACT) sys_signal(SIG,ACT)
9ab9afa9 74
00eaaa32 75/* Whether this is what all systems want or not, this is what
69037d5a 76 appears to be assumed in the source, for example data.c:arith_error. */
667da7f5 77typedef RETSIGTYPE (*signal_handler_t) (/*int*/);
00eaaa32 78
030f4475
AS
79signal_handler_t sys_signal P_ ((int signal_number, signal_handler_t action));
80sigset_t sys_sigblock P_ ((sigset_t new_mask));
81sigset_t sys_sigunblock P_ ((sigset_t new_mask));
82sigset_t sys_sigsetmask P_ ((sigset_t new_mask));
9ab9afa9 83
69037d5a 84#define sys_sigdel(MASK,SIG) sigdelset (&MASK,SIG)
9ab9afa9 85
985a35a3
JB
86#else /* ! defined (POSIX_SIGNALS) */
87#ifdef USG5_4
88
094d2b0e
GM
89extern SIGMASKTYPE sigprocmask_set;
90
69037d5a 91#ifndef sigblock
094d2b0e
GM
92#define sigblock(sig) \
93 (sigprocmask_set = SIGEMPTYMASK | (sig), \
94 sigprocmask (SIG_BLOCK, &sigprocmask_set, NULL))
69037d5a
RS
95#endif
96
fe54008f 97#ifndef sigunblock
094d2b0e
GM
98#define sigunblock(sig) \
99 (sigprocmask_set = SIGFULLMASK & ~(sig), \
100 sigprocmask (SIG_SETMASK, &sigprocmask_set, NULL))
fe54008f 101#endif
985a35a3
JB
102
103#else
104#ifdef USG
105
fe54008f 106#ifndef sigunblock
177c0ea7 107#define sigunblock(sig)
fe54008f 108#endif
985a35a3
JB
109
110#else
9ab9afa9 111
fe54008f 112#ifndef sigunblock
9ab9afa9
JB
113#define sigunblock(SIG) \
114{ SIGMASKTYPE omask = sigblock (SIGEMPTYMASK); sigsetmask (omask & ~SIG); }
fe54008f 115#endif
9ab9afa9 116
985a35a3
JB
117#endif /* ! defined (USG) */
118#endif /* ! defined (USG5_4) */
119#endif /* ! defined (POSIX_SIGNALS) */
9ab9afa9
JB
120
121#ifndef SIGMASKTYPE
122#define SIGMASKTYPE int
123#endif
124
125#ifndef SIGEMPTYMASK
1b1f8f85
JB
126#define SIGEMPTYMASK (0)
127#endif
128
129#ifndef SIGFULLMASK
130#define SIGFULLMASK (0xffffffff)
9ab9afa9
JB
131#endif
132
133#ifndef sigmask
134#define sigmask(no) (1L << ((no) - 1))
135#endif
136
1b1f8f85
JB
137#ifndef sigunblock
138#define sigunblock(SIG) \
139{ SIGMASKTYPE omask = sigblock (SIGFULLMASK); sigsetmask (omask & ~SIG); }
140#endif
141
1b1f8f85
JB
142#ifndef BSD4_1
143#define sigfree() sigsetmask (SIGEMPTYMASK)
ea973b10 144#endif /* not BSD4_1 */
1b1f8f85 145
68c45bf0
PE
146#if defined (SIGINFO) && defined (BROKEN_SIGINFO)
147#undef SIGINFO
148#endif
149#if defined (SIGIO) && defined (BROKEN_SIGIO)
098767d9
EZ
150# undef SIGIO
151# if defined (__Lynx__)
152# undef SIGPOLL /* Defined as SIGIO on LynxOS */
153# endif
68c45bf0
PE
154#endif
155#if defined (SIGPOLL) && defined (BROKEN_SIGPOLL)
156#undef SIGPOLL
157#endif
158#if defined (SIGTSTP) && defined (BROKEN_SIGTSTP)
159#undef SIGTSTP
160#endif
161#if defined (SIGURG) && defined (BROKEN_SIGURG)
162#undef SIGURG
163#endif
4e677396
KH
164#if defined (SIGAIO) && defined (BROKEN_SIGAIO)
165#undef SIGAIO
166#endif
167#if defined (SIGPTY) && defined (BROKEN_SIGPTY)
168#undef SIGPTY
169#endif
170
68c45bf0
PE
171
172#if NSIG < NSIG_MINIMUM
173# ifdef NSIG
174# undef NSIG
175# endif
176# define NSIG NSIG_MINIMUM
177#endif
178
9ab9afa9
JB
179#ifdef BSD4_1
180#define SIGIO SIGTINT
645280b7 181/* sigfree is in sysdep.c */
ea973b10 182#endif /* BSD4_1 */
9ab9afa9
JB
183
184/* On bsd, [man says] kill does not accept a negative number to kill a pgrp.
185 Must do that using the killpg call. */
6df54671 186#ifdef BSD_SYSTEM
9ab9afa9
JB
187#define EMACS_KILLPG(gid, signo) (killpg ( (gid), (signo)))
188#else
57d65592 189#ifdef WINDOWSNT
f405affb 190#define EMACS_KILLPG(gid, signo) (kill (gid, signo))
57d65592 191#else
9ab9afa9
JB
192#define EMACS_KILLPG(gid, signo) (kill (-(gid), (signo)))
193#endif
57d65592 194#endif
9ab9afa9
JB
195
196/* Define SIGCHLD as an alias for SIGCLD. There are many conditionals
197 testing SIGCHLD. */
9ab9afa9
JB
198#ifndef VMS
199#ifdef SIGCLD
200#ifndef SIGCHLD
201#define SIGCHLD SIGCLD
985a35a3
JB
202#endif /* SIGCHLD */
203#endif /* ! defined (SIGCLD) */
204#endif /* VMS */
68c45bf0
PE
205
206#ifndef HAVE_STRSIGNAL
207/* strsignal is in sysdep.c */
208char *strsignal ();
209#endif
ab5796a9 210
333f1b6f
JD
211#ifdef HAVE_GTK_AND_PTHREAD
212#define SIGNAL_THREAD_CHECK(signo) \
213 do { \
3fb8b536 214 if (!pthread_equal (pthread_self (), main_thread)) \
333f1b6f
JD
215 { \
216 /* POSIX says any thread can receive the signal. On GNU/Linux \
217 that is not true, but for other systems (FreeBSD at least) \
218 it is. So direct the signal to the correct thread and block \
219 it from this thread. */ \
220 sigset_t new_mask; \
221 \
222 sigemptyset (&new_mask); \
223 sigaddset (&new_mask, signo); \
224 pthread_sigmask (SIG_BLOCK, &new_mask, 0); \
225 pthread_kill (main_thread, signo); \
226 return; \
227 } \
228 } while (0)
229
230#else /* not HAVE_GTK_AND_PTHREAD */
231#define SIGNAL_THREAD_CHECK(signo)
232#endif /* not HAVE_GTK_AND_PTHREAD */
ab5796a9
MB
233/* arch-tag: 4580e86a-340d-4574-9e11-a742b6e1a152
234 (do not change this comment) */