Convert some prototypes to standard C.
[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,
114f9c96 3 2005, 2006, 2007, 2008, 2009, 2010 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
07b87a10 22#if defined (HAVE_GTK_AND_PTHREAD) || defined (HAVE_NS)
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
29#ifdef FORWARD_SIGNAL_TO_MAIN_THREAD
333f1b6f
JD
30extern pthread_t main_thread;
31#endif
32
c3aa5fec 33/* Don't #include <signal.h>. That header should always be #included
cf026b25
JB
34 before "config.h", because some configuration files (like s/hpux.h)
35 indicate that SIGIO doesn't work by #undef-ing SIGIO. If this file
36 #includes <signal.h>, then that will re-#define SIGIO and confuse
37 things. */
4d553a13 38/* XXX This is not correct anymore, there is a BROKEN_SIGIO macro. */
00eaaa32 39
9ab9afa9
JB
40#define SIGMASKTYPE sigset_t
41
42#define SIGEMPTYMASK (empty_mask)
43#define SIGFULLMASK (full_mask)
47b682b7 44extern sigset_t empty_mask, full_mask;
9ab9afa9 45
1b1f8f85 46/* POSIX pretty much destroys any possibility of writing sigmask as a
47b682b7
AS
47 macro in standard C. We always define our own version because the
48 predefined macro in Glibc 2.1 is only provided for compatility for old
49 programs that use int as signal mask type. */
50#undef sigmask
1b1f8f85
JB
51#ifdef __GNUC__
52#define sigmask(SIG) \
53 ({ \
54 sigset_t _mask; \
55 sigemptyset (&_mask); \
56 sigaddset (&_mask, SIG); \
57 _mask; \
58 })
985a35a3 59#else /* ! defined (__GNUC__) */
9bd67a37 60extern sigset_t sys_sigmask ();
1b1f8f85 61#define sigmask(SIG) (sys_sigmask (SIG))
985a35a3 62#endif /* ! defined (__GNUC__) */
1b1f8f85 63
47b682b7
AS
64#undef sigpause
65#define sigpause(MASK) sigsuspend (&(MASK))
9f910b50 66
69037d5a
RS
67#define sigblock(SIG) sys_sigblock (SIG)
68#define sigunblock(SIG) sys_sigunblock (SIG)
cc210d67 69#ifndef sigsetmask
69037d5a 70#define sigsetmask(SIG) sys_sigsetmask (SIG)
cc210d67 71#endif
9ab9afa9
JB
72#define sighold(SIG) ONLY_USED_IN_BSD_4_1
73#define sigrelse(SIG) ONLY_USED_IN_BSD_4_1
6c8a1e24 74#undef signal
9c063f29 75#define signal(SIG,ACT) sys_signal(SIG,ACT)
9ab9afa9 76
00eaaa32 77/* Whether this is what all systems want or not, this is what
69037d5a 78 appears to be assumed in the source, for example data.c:arith_error. */
c532d349 79typedef RETSIGTYPE (*signal_handler_t) (int);
00eaaa32 80
383e0970
J
81signal_handler_t sys_signal (int signal_number, signal_handler_t action);
82sigset_t sys_sigblock (sigset_t new_mask);
83sigset_t sys_sigunblock (sigset_t new_mask);
84sigset_t sys_sigsetmask (sigset_t new_mask);
9ab9afa9 85
69037d5a 86#define sys_sigdel(MASK,SIG) sigdelset (&MASK,SIG)
9ab9afa9 87
9ab9afa9
JB
88#ifndef SIGMASKTYPE
89#define SIGMASKTYPE int
90#endif
91
92#ifndef SIGEMPTYMASK
1b1f8f85
JB
93#define SIGEMPTYMASK (0)
94#endif
95
96#ifndef SIGFULLMASK
97#define SIGFULLMASK (0xffffffff)
9ab9afa9
JB
98#endif
99
100#ifndef sigmask
101#define sigmask(no) (1L << ((no) - 1))
102#endif
103
1b1f8f85
JB
104#ifndef sigunblock
105#define sigunblock(SIG) \
106{ SIGMASKTYPE omask = sigblock (SIGFULLMASK); sigsetmask (omask & ~SIG); }
107#endif
108
1b1f8f85 109#define sigfree() sigsetmask (SIGEMPTYMASK)
1b1f8f85 110
68c45bf0
PE
111#if defined (SIGINFO) && defined (BROKEN_SIGINFO)
112#undef SIGINFO
113#endif
114#if defined (SIGIO) && defined (BROKEN_SIGIO)
098767d9 115# undef SIGIO
68c45bf0
PE
116#endif
117#if defined (SIGPOLL) && defined (BROKEN_SIGPOLL)
118#undef SIGPOLL
119#endif
120#if defined (SIGTSTP) && defined (BROKEN_SIGTSTP)
121#undef SIGTSTP
122#endif
123#if defined (SIGURG) && defined (BROKEN_SIGURG)
124#undef SIGURG
125#endif
4e677396
KH
126#if defined (SIGAIO) && defined (BROKEN_SIGAIO)
127#undef SIGAIO
128#endif
129#if defined (SIGPTY) && defined (BROKEN_SIGPTY)
130#undef SIGPTY
131#endif
132
68c45bf0
PE
133
134#if NSIG < NSIG_MINIMUM
135# ifdef NSIG
136# undef NSIG
137# endif
138# define NSIG NSIG_MINIMUM
139#endif
140
9ab9afa9
JB
141/* On bsd, [man says] kill does not accept a negative number to kill a pgrp.
142 Must do that using the killpg call. */
6df54671 143#ifdef BSD_SYSTEM
9ab9afa9
JB
144#define EMACS_KILLPG(gid, signo) (killpg ( (gid), (signo)))
145#else
57d65592 146#ifdef WINDOWSNT
f405affb 147#define EMACS_KILLPG(gid, signo) (kill (gid, signo))
57d65592 148#else
9ab9afa9
JB
149#define EMACS_KILLPG(gid, signo) (kill (-(gid), (signo)))
150#endif
57d65592 151#endif
9ab9afa9
JB
152
153/* Define SIGCHLD as an alias for SIGCLD. There are many conditionals
154 testing SIGCHLD. */
9ab9afa9
JB
155#ifdef SIGCLD
156#ifndef SIGCHLD
157#define SIGCHLD SIGCLD
985a35a3
JB
158#endif /* SIGCHLD */
159#endif /* ! defined (SIGCLD) */
68c45bf0
PE
160
161#ifndef HAVE_STRSIGNAL
162/* strsignal is in sysdep.c */
163char *strsignal ();
164#endif
ab5796a9 165
f8240abd 166#ifdef FORWARD_SIGNAL_TO_MAIN_THREAD
333f1b6f
JD
167#define SIGNAL_THREAD_CHECK(signo) \
168 do { \
3fb8b536 169 if (!pthread_equal (pthread_self (), main_thread)) \
333f1b6f
JD
170 { \
171 /* POSIX says any thread can receive the signal. On GNU/Linux \
172 that is not true, but for other systems (FreeBSD at least) \
173 it is. So direct the signal to the correct thread and block \
174 it from this thread. */ \
175 sigset_t new_mask; \
176 \
177 sigemptyset (&new_mask); \
178 sigaddset (&new_mask, signo); \
179 pthread_sigmask (SIG_BLOCK, &new_mask, 0); \
180 pthread_kill (main_thread, signo); \
181 return; \
182 } \
183 } while (0)
184
f8240abd 185#else /* not FORWARD_SIGNAL_TO_MAIN_THREAD */
333f1b6f 186#define SIGNAL_THREAD_CHECK(signo)
f8240abd 187#endif /* not FORWARD_SIGNAL_TO_MAIN_THREAD */
ab5796a9
MB
188/* arch-tag: 4580e86a-340d-4574-9e11-a742b6e1a152
189 (do not change this comment) */