diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/ChangeLog | 56 | ||||
| -rw-r--r-- | src/alloc.c | 3 | ||||
| -rw-r--r-- | src/atimer.c | 49 | ||||
| -rw-r--r-- | src/callproc.c | 4 | ||||
| -rw-r--r-- | src/conf_post.h | 5 | ||||
| -rw-r--r-- | src/data.c | 7 | ||||
| -rw-r--r-- | src/dispnew.c | 11 | ||||
| -rw-r--r-- | src/emacs.c | 82 | ||||
| -rw-r--r-- | src/emacsgtkfixed.c | 1 | ||||
| -rw-r--r-- | src/floatfns.c | 1 | ||||
| -rw-r--r-- | src/gtkutil.c | 15 | ||||
| -rw-r--r-- | src/keyboard.c | 72 | ||||
| -rw-r--r-- | src/nsfns.m | 1 | ||||
| -rw-r--r-- | src/process.c | 33 | ||||
| -rw-r--r-- | src/sound.c | 24 | ||||
| -rw-r--r-- | src/sysdep.c | 111 | ||||
| -rw-r--r-- | src/syssignal.h | 59 | ||||
| -rw-r--r-- | src/term.c | 19 | ||||
| -rw-r--r-- | src/widget.c | 3 | ||||
| -rw-r--r-- | src/xmenu.c | 5 | ||||
| -rw-r--r-- | src/xterm.c | 22 |
21 files changed, 314 insertions, 269 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index 479fb38e60b..3bfa9e929d5 100644 --- a/src/ChangeLog +++ b/src/ChangeLog | |||
| @@ -1,3 +1,57 @@ | |||
| 1 | 2012-09-06 Paul Eggert <eggert@cs.ucla.edu> | ||
| 2 | |||
| 3 | Signal-handler cleanup (Bug#12327). | ||
| 4 | Emacs's signal handlers were written in the old 4.2BSD style with | ||
| 5 | sigblock and sigmask and so forth, and this led to some | ||
| 6 | inefficiencies and confusion. Rewrite these to use | ||
| 7 | pthread_sigmask etc. without copying signal sets around. Also, | ||
| 8 | get rid of the confusing macros 'SIGNAL_THREAD_CHECK' and | ||
| 9 | 'signal', and instead use functions that do not attempt to take | ||
| 10 | over the system name space. This patch causes Emacs's text | ||
| 11 | segment to shrink by 0.7% on my platform, Fedora 17 x86-64. | ||
| 12 | * alloc.c, emacsgtkfixed.c, nsfns.m, widget.c, xmenu.c: | ||
| 13 | Do not include <signal.h> or "syssignal.h", as these | ||
| 14 | modules do not use signals. | ||
| 15 | * atimer.c, callproc.c, data.c, dispnew.c, emacs.c, floatfns.c: | ||
| 16 | * gtkutil.c, keyboard.c, process.c, sound.c, sysdep.c, term.c, xterm.c: | ||
| 17 | Do not include <signal.h>, as "syssignal.h" does that for us now. | ||
| 18 | * atimer.c (sigmask_atimers): New function. | ||
| 19 | (block_atimers, unblock_atimers): New functions, | ||
| 20 | replacing the old macros BLOCK_ATIMERS and UNBLOCK_ATIMERS. | ||
| 21 | All uses replaced. | ||
| 22 | * conf_post.h [SIGNAL_H_AHB]: Do not include <signal.h>; | ||
| 23 | no longer needed here. | ||
| 24 | * emacs.c (main): Inspect existing signal handler with sigaction, | ||
| 25 | so that there's no need to block and unblock SIGHUP. | ||
| 26 | * sysdep.c (struct save_signal): New member 'action', replacing | ||
| 27 | old member 'handler'. | ||
| 28 | (save_signal_handlers, restore_signal_handlers): | ||
| 29 | Use sigaction instead of 'signal' to save and restore. | ||
| 30 | (get_set_sighandler, set_sighandler) [!WINDOWSNT]: | ||
| 31 | New function. All users of 'signal' modified to use set_sighandler | ||
| 32 | if they're writeonly, and to use sys_signal if they're read+write. | ||
| 33 | (emacs_sigaction_init, forwarded_signal): New functions. | ||
| 34 | (sys_signal): Remove. All uses replaced by calls to sigaction | ||
| 35 | and emacs_sigaction_init, or by direct calls to 'signal'. | ||
| 36 | (sys_sigmask) [!__GNUC__]: Remove; no longer needed. | ||
| 37 | (sys_sigblock, sys_sigunblock, sys_sigsetmask): Remove; | ||
| 38 | all uses replaced by pthread_sigmask etc. calls. | ||
| 39 | * syssignal.h: Include <signal.h>. | ||
| 40 | (emacs_sigaction_init, forwarded_signal): New decls. | ||
| 41 | (SIGMASKTYPE): Remove. All uses replaced by its definiens, sigset_t. | ||
| 42 | (SIGEMPTYMASK): Remove; all uses replaced by its definiens, empty_mask. | ||
| 43 | (sigmask, sys_sigmask): Remove; no longer needed. | ||
| 44 | (sigpause): Remove. All uses replaced by its definiens, sigsuspend. | ||
| 45 | (sigblock, sigunblock, sigfree): | ||
| 46 | (sigsetmask) [!defined sigsetmask]: | ||
| 47 | Remove. All uses replaced by pthread_sigmask. | ||
| 48 | (signal): Remove. Its remaining uses (with SIG_DFL and SIG_IGN) | ||
| 49 | no longer need to be replaced, and its typical old uses | ||
| 50 | are now done via emacs_sigaction_init and sigaction. | ||
| 51 | (sys_sigblock, sys_sigunblock, sys_sigsetmask): Remove decls. | ||
| 52 | (sys_sigdel): Remove; unused. | ||
| 53 | (NSIG): Remove a FIXME; the code's fine. Remove an unnecessary ifdef. | ||
| 54 | |||
| 1 | 2012-09-06 Eli Zaretskii <eliz@gnu.org> | 55 | 2012-09-06 Eli Zaretskii <eliz@gnu.org> |
| 2 | 56 | ||
| 3 | * process.c (CAN_HANDLE_MULTIPLE_CHILDREN): Fix a typo that broke | 57 | * process.c (CAN_HANDLE_MULTIPLE_CHILDREN): Fix a typo that broke |
| @@ -50,7 +104,7 @@ | |||
| 50 | 104 | ||
| 51 | 2012-09-05 Paul Eggert <eggert@cs.ucla.edu> | 105 | 2012-09-05 Paul Eggert <eggert@cs.ucla.edu> |
| 52 | 106 | ||
| 53 | Fix race conditions with signal handlers and errno. | 107 | Fix race conditions with signal handlers and errno (Bug#12327). |
| 54 | Be more systematic about preserving errno whenever a signal | 108 | Be more systematic about preserving errno whenever a signal |
| 55 | handler returns, even if it's not in the main thread. Do this by | 109 | handler returns, even if it's not in the main thread. Do this by |
| 56 | renaming signal handlers to distinguish between signal delivery | 110 | renaming signal handlers to distinguish between signal delivery |
diff --git a/src/alloc.c b/src/alloc.c index 1a9718bcb25..bf7c156d321 100644 --- a/src/alloc.c +++ b/src/alloc.c | |||
| @@ -26,8 +26,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ | |||
| 26 | #include <limits.h> /* For CHAR_BIT. */ | 26 | #include <limits.h> /* For CHAR_BIT. */ |
| 27 | #include <setjmp.h> | 27 | #include <setjmp.h> |
| 28 | 28 | ||
| 29 | #include <signal.h> | ||
| 30 | |||
| 31 | #ifdef HAVE_PTHREAD | 29 | #ifdef HAVE_PTHREAD |
| 32 | #include <pthread.h> | 30 | #include <pthread.h> |
| 33 | #endif | 31 | #endif |
| @@ -42,7 +40,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ | |||
| 42 | #include "keyboard.h" | 40 | #include "keyboard.h" |
| 43 | #include "frame.h" | 41 | #include "frame.h" |
| 44 | #include "blockinput.h" | 42 | #include "blockinput.h" |
| 45 | #include "syssignal.h" | ||
| 46 | #include "termhooks.h" /* For struct terminal. */ | 43 | #include "termhooks.h" /* For struct terminal. */ |
| 47 | #include <setjmp.h> | 44 | #include <setjmp.h> |
| 48 | #include <verify.h> | 45 | #include <verify.h> |
diff --git a/src/atimer.c b/src/atimer.c index 060dead9b17..34731920af5 100644 --- a/src/atimer.c +++ b/src/atimer.c | |||
| @@ -17,7 +17,6 @@ You should have received a copy of the GNU General Public License | |||
| 17 | along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ | 17 | along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ |
| 18 | 18 | ||
| 19 | #include <config.h> | 19 | #include <config.h> |
| 20 | #include <signal.h> | ||
| 21 | #include <stdio.h> | 20 | #include <stdio.h> |
| 22 | #include <setjmp.h> | 21 | #include <setjmp.h> |
| 23 | #include "lisp.h" | 22 | #include "lisp.h" |
| @@ -51,8 +50,24 @@ int pending_atimers; | |||
| 51 | 50 | ||
| 52 | /* Block/unblock SIGALRM. */ | 51 | /* Block/unblock SIGALRM. */ |
| 53 | 52 | ||
| 54 | #define BLOCK_ATIMERS sigblock (sigmask (SIGALRM)) | 53 | static void |
| 55 | #define UNBLOCK_ATIMERS sigunblock (sigmask (SIGALRM)) | 54 | sigmask_atimers (int how) |
| 55 | { | ||
| 56 | sigset_t blocked; | ||
| 57 | sigemptyset (&blocked); | ||
| 58 | sigaddset (&blocked, SIGALRM); | ||
| 59 | pthread_sigmask (how, &blocked, 0); | ||
| 60 | } | ||
| 61 | static void | ||
| 62 | block_atimers (void) | ||
| 63 | { | ||
| 64 | sigmask_atimers (SIG_BLOCK); | ||
| 65 | } | ||
| 66 | static void | ||
| 67 | unblock_atimers (void) | ||
| 68 | { | ||
| 69 | sigmask_atimers (SIG_UNBLOCK); | ||
| 70 | } | ||
| 56 | 71 | ||
| 57 | /* Function prototypes. */ | 72 | /* Function prototypes. */ |
| 58 | 73 | ||
| @@ -109,7 +124,7 @@ start_atimer (enum atimer_type type, EMACS_TIME timestamp, atimer_callback fn, | |||
| 109 | t->fn = fn; | 124 | t->fn = fn; |
| 110 | t->client_data = client_data; | 125 | t->client_data = client_data; |
| 111 | 126 | ||
| 112 | BLOCK_ATIMERS; | 127 | block_atimers (); |
| 113 | 128 | ||
| 114 | /* Compute the timer's expiration time. */ | 129 | /* Compute the timer's expiration time. */ |
| 115 | switch (type) | 130 | switch (type) |
| @@ -130,7 +145,7 @@ start_atimer (enum atimer_type type, EMACS_TIME timestamp, atimer_callback fn, | |||
| 130 | 145 | ||
| 131 | /* Insert the timer in the list of active atimers. */ | 146 | /* Insert the timer in the list of active atimers. */ |
| 132 | schedule_atimer (t); | 147 | schedule_atimer (t); |
| 133 | UNBLOCK_ATIMERS; | 148 | unblock_atimers (); |
| 134 | 149 | ||
| 135 | /* Arrange for a SIGALRM at the time the next atimer is ripe. */ | 150 | /* Arrange for a SIGALRM at the time the next atimer is ripe. */ |
| 136 | set_alarm (); | 151 | set_alarm (); |
| @@ -146,7 +161,7 @@ cancel_atimer (struct atimer *timer) | |||
| 146 | { | 161 | { |
| 147 | int i; | 162 | int i; |
| 148 | 163 | ||
| 149 | BLOCK_ATIMERS; | 164 | block_atimers (); |
| 150 | 165 | ||
| 151 | for (i = 0; i < 2; ++i) | 166 | for (i = 0; i < 2; ++i) |
| 152 | { | 167 | { |
| @@ -173,7 +188,7 @@ cancel_atimer (struct atimer *timer) | |||
| 173 | } | 188 | } |
| 174 | } | 189 | } |
| 175 | 190 | ||
| 176 | UNBLOCK_ATIMERS; | 191 | unblock_atimers (); |
| 177 | } | 192 | } |
| 178 | 193 | ||
| 179 | 194 | ||
| @@ -204,7 +219,7 @@ append_atimer_lists (struct atimer *list_1, struct atimer *list_2) | |||
| 204 | void | 219 | void |
| 205 | stop_other_atimers (struct atimer *t) | 220 | stop_other_atimers (struct atimer *t) |
| 206 | { | 221 | { |
| 207 | BLOCK_ATIMERS; | 222 | block_atimers (); |
| 208 | 223 | ||
| 209 | if (t) | 224 | if (t) |
| 210 | { | 225 | { |
| @@ -229,7 +244,7 @@ stop_other_atimers (struct atimer *t) | |||
| 229 | 244 | ||
| 230 | stopped_atimers = append_atimer_lists (atimers, stopped_atimers); | 245 | stopped_atimers = append_atimer_lists (atimers, stopped_atimers); |
| 231 | atimers = t; | 246 | atimers = t; |
| 232 | UNBLOCK_ATIMERS; | 247 | unblock_atimers (); |
| 233 | } | 248 | } |
| 234 | 249 | ||
| 235 | 250 | ||
| @@ -244,7 +259,7 @@ run_all_atimers (void) | |||
| 244 | struct atimer *t = atimers; | 259 | struct atimer *t = atimers; |
| 245 | struct atimer *next; | 260 | struct atimer *next; |
| 246 | 261 | ||
| 247 | BLOCK_ATIMERS; | 262 | block_atimers (); |
| 248 | atimers = stopped_atimers; | 263 | atimers = stopped_atimers; |
| 249 | stopped_atimers = NULL; | 264 | stopped_atimers = NULL; |
| 250 | 265 | ||
| @@ -255,7 +270,7 @@ run_all_atimers (void) | |||
| 255 | t = next; | 270 | t = next; |
| 256 | } | 271 | } |
| 257 | 272 | ||
| 258 | UNBLOCK_ATIMERS; | 273 | unblock_atimers (); |
| 259 | } | 274 | } |
| 260 | } | 275 | } |
| 261 | 276 | ||
| @@ -397,9 +412,9 @@ do_pending_atimers (void) | |||
| 397 | { | 412 | { |
| 398 | if (pending_atimers) | 413 | if (pending_atimers) |
| 399 | { | 414 | { |
| 400 | BLOCK_ATIMERS; | 415 | block_atimers (); |
| 401 | run_timers (); | 416 | run_timers (); |
| 402 | UNBLOCK_ATIMERS; | 417 | unblock_atimers (); |
| 403 | } | 418 | } |
| 404 | } | 419 | } |
| 405 | 420 | ||
| @@ -412,7 +427,9 @@ turn_on_atimers (bool on) | |||
| 412 | { | 427 | { |
| 413 | if (on) | 428 | if (on) |
| 414 | { | 429 | { |
| 415 | signal (SIGALRM, deliver_alarm_signal); | 430 | struct sigaction action; |
| 431 | emacs_sigaction_init (&action, deliver_alarm_signal); | ||
| 432 | sigaction (SIGALRM, &action, 0); | ||
| 416 | set_alarm (); | 433 | set_alarm (); |
| 417 | } | 434 | } |
| 418 | else | 435 | else |
| @@ -423,8 +440,10 @@ turn_on_atimers (bool on) | |||
| 423 | void | 440 | void |
| 424 | init_atimer (void) | 441 | init_atimer (void) |
| 425 | { | 442 | { |
| 443 | struct sigaction action; | ||
| 426 | free_atimers = stopped_atimers = atimers = NULL; | 444 | free_atimers = stopped_atimers = atimers = NULL; |
| 427 | pending_atimers = 0; | 445 | pending_atimers = 0; |
| 428 | /* pending_signals is initialized in init_keyboard.*/ | 446 | /* pending_signals is initialized in init_keyboard.*/ |
| 429 | signal (SIGALRM, deliver_alarm_signal); | 447 | emacs_sigaction_init (&action, deliver_alarm_signal); |
| 448 | sigaction (SIGALRM, &action, 0); | ||
| 430 | } | 449 | } |
diff --git a/src/callproc.c b/src/callproc.c index 2e9a8950700..a92959a1559 100644 --- a/src/callproc.c +++ b/src/callproc.c | |||
| @@ -19,7 +19,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ | |||
| 19 | 19 | ||
| 20 | 20 | ||
| 21 | #include <config.h> | 21 | #include <config.h> |
| 22 | #include <signal.h> | ||
| 23 | #include <errno.h> | 22 | #include <errno.h> |
| 24 | #include <stdio.h> | 23 | #include <stdio.h> |
| 25 | #include <setjmp.h> | 24 | #include <setjmp.h> |
| @@ -506,9 +505,6 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */) | |||
| 506 | 505 | ||
| 507 | if (fd_output >= 0) | 506 | if (fd_output >= 0) |
| 508 | fd1 = fd_output; | 507 | fd1 = fd_output; |
| 509 | #if 0 /* Some systems don't have sigblock. */ | ||
| 510 | mask = sigblock (sigmask (SIGCHLD)); | ||
| 511 | #endif | ||
| 512 | 508 | ||
| 513 | /* Record that we're about to create a synchronous process. */ | 509 | /* Record that we're about to create a synchronous process. */ |
| 514 | synch_process_alive = 1; | 510 | synch_process_alive = 1; |
diff --git a/src/conf_post.h b/src/conf_post.h index cef55863752..1bf40af260b 100644 --- a/src/conf_post.h +++ b/src/conf_post.h | |||
| @@ -40,11 +40,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ | |||
| 40 | #endif | 40 | #endif |
| 41 | #endif | 41 | #endif |
| 42 | 42 | ||
| 43 | #ifdef SIGNAL_H_AHB | ||
| 44 | #undef SIGNAL_H_AHB | ||
| 45 | #include <signal.h> | ||
| 46 | #endif | ||
| 47 | |||
| 48 | /* This silences a few compilation warnings on FreeBSD. */ | 43 | /* This silences a few compilation warnings on FreeBSD. */ |
| 49 | #ifdef BSD_SYSTEM_AHB | 44 | #ifdef BSD_SYSTEM_AHB |
| 50 | #undef BSD_SYSTEM_AHB | 45 | #undef BSD_SYSTEM_AHB |
diff --git a/src/data.c b/src/data.c index 6151d815b29..5fbf43e424e 100644 --- a/src/data.c +++ b/src/data.c | |||
| @@ -19,7 +19,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ | |||
| 19 | 19 | ||
| 20 | 20 | ||
| 21 | #include <config.h> | 21 | #include <config.h> |
| 22 | #include <signal.h> | ||
| 23 | #include <stdio.h> | 22 | #include <stdio.h> |
| 24 | #include <setjmp.h> | 23 | #include <setjmp.h> |
| 25 | 24 | ||
| @@ -3210,7 +3209,7 @@ syms_of_data (void) | |||
| 3210 | static _Noreturn void | 3209 | static _Noreturn void |
| 3211 | handle_arith_signal (int sig) | 3210 | handle_arith_signal (int sig) |
| 3212 | { | 3211 | { |
| 3213 | sigsetmask (SIGEMPTYMASK); | 3212 | pthread_sigmask (SIG_SETMASK, &empty_mask, 0); |
| 3214 | xsignal0 (Qarith_error); | 3213 | xsignal0 (Qarith_error); |
| 3215 | } | 3214 | } |
| 3216 | 3215 | ||
| @@ -3223,6 +3222,7 @@ deliver_arith_signal (int sig) | |||
| 3223 | void | 3222 | void |
| 3224 | init_data (void) | 3223 | init_data (void) |
| 3225 | { | 3224 | { |
| 3225 | struct sigaction action; | ||
| 3226 | /* Don't do this if just dumping out. | 3226 | /* Don't do this if just dumping out. |
| 3227 | We don't want to call `signal' in this case | 3227 | We don't want to call `signal' in this case |
| 3228 | so that we don't have trouble with dumping | 3228 | so that we don't have trouble with dumping |
| @@ -3231,5 +3231,6 @@ init_data (void) | |||
| 3231 | if (!initialized) | 3231 | if (!initialized) |
| 3232 | return; | 3232 | return; |
| 3233 | #endif /* CANNOT_DUMP */ | 3233 | #endif /* CANNOT_DUMP */ |
| 3234 | signal (SIGFPE, deliver_arith_signal); | 3234 | emacs_sigaction_init (&action, deliver_arith_signal); |
| 3235 | sigaction (SIGFPE, &action, 0); | ||
| 3235 | } | 3236 | } |
diff --git a/src/dispnew.c b/src/dispnew.c index e02b33000d8..85b3254aae3 100644 --- a/src/dispnew.c +++ b/src/dispnew.c | |||
| @@ -21,7 +21,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ | |||
| 21 | 21 | ||
| 22 | #define DISPEXTERN_INLINE EXTERN_INLINE | 22 | #define DISPEXTERN_INLINE EXTERN_INLINE |
| 23 | 23 | ||
| 24 | #include <signal.h> | ||
| 25 | #include <stdio.h> | 24 | #include <stdio.h> |
| 26 | #include <setjmp.h> | 25 | #include <setjmp.h> |
| 27 | #include <unistd.h> | 26 | #include <unistd.h> |
| @@ -5560,7 +5559,9 @@ handle_window_change_signal (int sig) | |||
| 5560 | int width, height; | 5559 | int width, height; |
| 5561 | struct tty_display_info *tty; | 5560 | struct tty_display_info *tty; |
| 5562 | 5561 | ||
| 5563 | signal (SIGWINCH, deliver_window_change_signal); | 5562 | struct sigaction action; |
| 5563 | emacs_sigaction_init (&action, deliver_window_change_signal); | ||
| 5564 | sigaction (SIGWINCH, &action, 0); | ||
| 5564 | 5565 | ||
| 5565 | /* The frame size change obviously applies to a single | 5566 | /* The frame size change obviously applies to a single |
| 5566 | termcap-controlled terminal, but we can't decide which. | 5567 | termcap-controlled terminal, but we can't decide which. |
| @@ -6175,7 +6176,11 @@ init_display (void) | |||
| 6175 | #ifndef CANNOT_DUMP | 6176 | #ifndef CANNOT_DUMP |
| 6176 | if (initialized) | 6177 | if (initialized) |
| 6177 | #endif /* CANNOT_DUMP */ | 6178 | #endif /* CANNOT_DUMP */ |
| 6178 | signal (SIGWINCH, deliver_window_change_signal); | 6179 | { |
| 6180 | struct sigaction action; | ||
| 6181 | emacs_sigaction_init (&action, deliver_window_change_signal); | ||
| 6182 | sigaction (SIGWINCH, &action, 0); | ||
| 6183 | } | ||
| 6179 | #endif /* SIGWINCH */ | 6184 | #endif /* SIGWINCH */ |
| 6180 | 6185 | ||
| 6181 | /* If running as a daemon, no need to initialize any frames/terminal. */ | 6186 | /* If running as a daemon, no need to initialize any frames/terminal. */ |
diff --git a/src/emacs.c b/src/emacs.c index fc92b30af26..ff50f409d5c 100644 --- a/src/emacs.c +++ b/src/emacs.c | |||
| @@ -20,7 +20,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ | |||
| 20 | 20 | ||
| 21 | 21 | ||
| 22 | #include <config.h> | 22 | #include <config.h> |
| 23 | #include <signal.h> | ||
| 24 | #include <errno.h> | 23 | #include <errno.h> |
| 25 | #include <stdio.h> | 24 | #include <stdio.h> |
| 26 | 25 | ||
| @@ -322,7 +321,12 @@ fatal_error_backtrace (int sig, int backtrace_limit) | |||
| 322 | going to send is probably blocked, so we have to unblock it if we | 321 | going to send is probably blocked, so we have to unblock it if we |
| 323 | want to really receive it. */ | 322 | want to really receive it. */ |
| 324 | #ifndef MSDOS | 323 | #ifndef MSDOS |
| 325 | sigunblock (sigmask (fatal_error_code)); | 324 | { |
| 325 | sigset_t unblocked; | ||
| 326 | sigemptyset (&unblocked); | ||
| 327 | sigaddset (&unblocked, fatal_error_code); | ||
| 328 | pthread_sigmask (SIG_UNBLOCK, &unblocked, 0); | ||
| 329 | } | ||
| 326 | #endif | 330 | #endif |
| 327 | 331 | ||
| 328 | kill (getpid (), fatal_error_code); | 332 | kill (getpid (), fatal_error_code); |
| @@ -339,7 +343,10 @@ static void deliver_danger_signal (int); | |||
| 339 | static void | 343 | static void |
| 340 | handle_danger_signal (int sig) | 344 | handle_danger_signal (int sig) |
| 341 | { | 345 | { |
| 342 | signal (sig, deliver_danger_signal); | 346 | struct sigaction action; |
| 347 | emacs_sigaction_init (&action, deliver_danger_signal); | ||
| 348 | sigaction (sig, &action, 0); | ||
| 349 | |||
| 343 | malloc_warning ("Operating system warns that virtual memory is running low.\n"); | 350 | malloc_warning ("Operating system warns that virtual memory is running low.\n"); |
| 344 | 351 | ||
| 345 | /* It might be unsafe to call do_auto_save now. */ | 352 | /* It might be unsafe to call do_auto_save now. */ |
| @@ -683,6 +690,7 @@ main (int argc, char **argv) | |||
| 683 | char dname_arg2[80]; | 690 | char dname_arg2[80]; |
| 684 | #endif | 691 | #endif |
| 685 | char *ch_to_dir; | 692 | char *ch_to_dir; |
| 693 | struct sigaction fatal_error_action; | ||
| 686 | 694 | ||
| 687 | #if GC_MARK_STACK | 695 | #if GC_MARK_STACK |
| 688 | stack_base = &dummy; | 696 | stack_base = &dummy; |
| @@ -1103,6 +1111,7 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem | |||
| 1103 | } | 1111 | } |
| 1104 | 1112 | ||
| 1105 | init_signals (); | 1113 | init_signals (); |
| 1114 | emacs_sigaction_init (&fatal_error_action, deliver_fatal_signal); | ||
| 1106 | 1115 | ||
| 1107 | /* Don't catch SIGHUP if dumping. */ | 1116 | /* Don't catch SIGHUP if dumping. */ |
| 1108 | if (1 | 1117 | if (1 |
| @@ -1111,13 +1120,17 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem | |||
| 1111 | #endif | 1120 | #endif |
| 1112 | ) | 1121 | ) |
| 1113 | { | 1122 | { |
| 1114 | sigblock (sigmask (SIGHUP)); | ||
| 1115 | /* In --batch mode, don't catch SIGHUP if already ignored. | 1123 | /* In --batch mode, don't catch SIGHUP if already ignored. |
| 1116 | That makes nohup work. */ | 1124 | That makes nohup work. */ |
| 1117 | if (! noninteractive | 1125 | bool catch_SIGHUP = !noninteractive; |
| 1118 | || signal (SIGHUP, SIG_IGN) != SIG_IGN) | 1126 | if (!catch_SIGHUP) |
| 1119 | signal (SIGHUP, deliver_fatal_signal); | 1127 | { |
| 1120 | sigunblock (sigmask (SIGHUP)); | 1128 | struct sigaction old_action; |
| 1129 | sigaction (SIGHUP, 0, &old_action); | ||
| 1130 | catch_SIGHUP = old_action.sa_handler != SIG_IGN; | ||
| 1131 | } | ||
| 1132 | if (catch_SIGHUP) | ||
| 1133 | sigaction (SIGHUP, &fatal_error_action, 0); | ||
| 1121 | } | 1134 | } |
| 1122 | 1135 | ||
| 1123 | if ( | 1136 | if ( |
| @@ -1141,68 +1154,73 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem | |||
| 1141 | add_user_signal (SIGUSR2, "sigusr2"); | 1154 | add_user_signal (SIGUSR2, "sigusr2"); |
| 1142 | #endif | 1155 | #endif |
| 1143 | #ifdef SIGABRT | 1156 | #ifdef SIGABRT |
| 1144 | signal (SIGABRT, deliver_fatal_signal); | 1157 | sigaction (SIGABRT, &fatal_error_action, 0); |
| 1145 | #endif | 1158 | #endif |
| 1146 | #ifdef SIGHWE | 1159 | #ifdef SIGHWE |
| 1147 | signal (SIGHWE, deliver_fatal_signal); | 1160 | sigaction (SIGHWE, &fatal_error_action, 0); |
| 1148 | #endif | 1161 | #endif |
| 1149 | #ifdef SIGPRE | 1162 | #ifdef SIGPRE |
| 1150 | signal (SIGPRE, deliver_fatal_signal); | 1163 | sigaction (SIGPRE, &fatal_error_action, 0); |
| 1151 | #endif | 1164 | #endif |
| 1152 | #ifdef SIGORE | 1165 | #ifdef SIGORE |
| 1153 | signal (SIGORE, deliver_fatal_signal); | 1166 | sigaction (SIGORE, &fatal_error_action, 0); |
| 1154 | #endif | 1167 | #endif |
| 1155 | #ifdef SIGUME | 1168 | #ifdef SIGUME |
| 1156 | signal (SIGUME, deliver_fatal_signal); | 1169 | sigaction (SIGUME, &fatal_error_action, 0); |
| 1157 | #endif | 1170 | #endif |
| 1158 | #ifdef SIGDLK | 1171 | #ifdef SIGDLK |
| 1159 | signal (SIGDLK, deliver_fatal_signal); | 1172 | sigaction (SIGDLK, &fatal_error_action, 0); |
| 1160 | #endif | 1173 | #endif |
| 1161 | #ifdef SIGCPULIM | 1174 | #ifdef SIGCPULIM |
| 1162 | signal (SIGCPULIM, deliver_fatal_signal); | 1175 | sigaction (SIGCPULIM, &fatal_error_action, 0); |
| 1163 | #endif | 1176 | #endif |
| 1164 | #ifdef SIGIOT | 1177 | #ifdef SIGIOT |
| 1165 | /* This is missing on some systems - OS/2, for example. */ | 1178 | /* This is missing on some systems - OS/2, for example. */ |
| 1166 | signal (SIGIOT, deliver_fatal_signal); | 1179 | sigaction (SIGIOT, &fatal_error_action, 0); |
| 1167 | #endif | 1180 | #endif |
| 1168 | #ifdef SIGEMT | 1181 | #ifdef SIGEMT |
| 1169 | signal (SIGEMT, deliver_fatal_signal); | 1182 | sigaction (SIGEMT, &fatal_error_action, 0); |
| 1170 | #endif | 1183 | #endif |
| 1171 | signal (SIGFPE, deliver_fatal_signal); | 1184 | sigaction (SIGFPE, &fatal_error_action, 0); |
| 1172 | #ifdef SIGBUS | 1185 | #ifdef SIGBUS |
| 1173 | signal (SIGBUS, deliver_fatal_signal); | 1186 | sigaction (SIGBUS, &fatal_error_action, 0); |
| 1174 | #endif | 1187 | #endif |
| 1175 | signal (SIGSEGV, deliver_fatal_signal); | 1188 | sigaction (SIGSEGV, &fatal_error_action, 0); |
| 1176 | #ifdef SIGSYS | 1189 | #ifdef SIGSYS |
| 1177 | signal (SIGSYS, deliver_fatal_signal); | 1190 | sigaction (SIGSYS, &fatal_error_action, 0); |
| 1178 | #endif | 1191 | #endif |
| 1179 | /* May need special treatment on MS-Windows. See | 1192 | /* May need special treatment on MS-Windows. See |
| 1180 | http://lists.gnu.org/archive/html/emacs-devel/2010-09/msg01062.html | 1193 | http://lists.gnu.org/archive/html/emacs-devel/2010-09/msg01062.html |
| 1181 | Please update the doc of kill-emacs, kill-emacs-hook, and | 1194 | Please update the doc of kill-emacs, kill-emacs-hook, and |
| 1182 | NEWS if you change this. | 1195 | NEWS if you change this. |
| 1183 | */ | 1196 | */ |
| 1184 | if (noninteractive) signal (SIGINT, deliver_fatal_signal); | 1197 | if (noninteractive) |
| 1185 | signal (SIGTERM, deliver_fatal_signal); | 1198 | sigaction (SIGINT, &fatal_error_action, 0); |
| 1199 | sigaction (SIGTERM, &fatal_error_action, 0); | ||
| 1186 | #ifdef SIGXCPU | 1200 | #ifdef SIGXCPU |
| 1187 | signal (SIGXCPU, deliver_fatal_signal); | 1201 | sigaction (SIGXCPU, &fatal_error_action, 0); |
| 1188 | #endif | 1202 | #endif |
| 1189 | #ifdef SIGXFSZ | 1203 | #ifdef SIGXFSZ |
| 1190 | signal (SIGXFSZ, deliver_fatal_signal); | 1204 | sigaction (SIGXFSZ, &fatal_error_action, 0); |
| 1191 | #endif /* SIGXFSZ */ | 1205 | #endif /* SIGXFSZ */ |
| 1192 | 1206 | ||
| 1193 | #ifdef SIGDANGER | 1207 | #ifdef SIGDANGER |
| 1194 | /* This just means available memory is getting low. */ | 1208 | /* This just means available memory is getting low. */ |
| 1195 | signal (SIGDANGER, deliver_danger_signal); | 1209 | { |
| 1210 | struct sigaction action; | ||
| 1211 | emacs_sigaction_init (&action, deliver_danger_signal); | ||
| 1212 | sigaction (SIGDANGER, &action, 0); | ||
| 1213 | } | ||
| 1196 | #endif | 1214 | #endif |
| 1197 | 1215 | ||
| 1198 | #ifdef AIX | 1216 | #ifdef AIX |
| 1199 | /* 20 is SIGCHLD, 21 is SIGTTIN, 22 is SIGTTOU. */ | 1217 | /* 20 is SIGCHLD, 21 is SIGTTIN, 22 is SIGTTOU. */ |
| 1200 | signal (SIGXCPU, deliver_fatal_signal); | 1218 | sigaction (SIGXCPU, &fatal_error_action, 0); |
| 1201 | signal (SIGIOINT, deliver_fatal_signal); | 1219 | sigaction (SIGIOINT, &fatal_error_action, 0); |
| 1202 | signal (SIGGRANT, deliver_fatal_signal); | 1220 | sigaction (SIGGRANT, &fatal_error_action, 0); |
| 1203 | signal (SIGRETRACT, deliver_fatal_signal); | 1221 | sigaction (SIGRETRACT, &fatal_error_action, 0); |
| 1204 | signal (SIGSOUND, deliver_fatal_signal); | 1222 | sigaction (SIGSOUND, &fatal_error_action, 0); |
| 1205 | signal (SIGMSG, deliver_fatal_signal); | 1223 | sigaction (SIGMSG, &fatal_error_action, 0); |
| 1206 | #endif /* AIX */ | 1224 | #endif /* AIX */ |
| 1207 | } | 1225 | } |
| 1208 | 1226 | ||
diff --git a/src/emacsgtkfixed.c b/src/emacsgtkfixed.c index 1a62b59b7af..940482654b3 100644 --- a/src/emacsgtkfixed.c +++ b/src/emacsgtkfixed.c | |||
| @@ -21,7 +21,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ | |||
| 21 | #include <config.h> | 21 | #include <config.h> |
| 22 | 22 | ||
| 23 | #include "emacsgtkfixed.h" | 23 | #include "emacsgtkfixed.h" |
| 24 | #include <signal.h> | ||
| 25 | #include <stdio.h> | 24 | #include <stdio.h> |
| 26 | #include <setjmp.h> | 25 | #include <setjmp.h> |
| 27 | #include "lisp.h" | 26 | #include "lisp.h" |
diff --git a/src/floatfns.c b/src/floatfns.c index f59cf58228a..e956dc22353 100644 --- a/src/floatfns.c +++ b/src/floatfns.c | |||
| @@ -45,7 +45,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ | |||
| 45 | */ | 45 | */ |
| 46 | 46 | ||
| 47 | #include <config.h> | 47 | #include <config.h> |
| 48 | #include <signal.h> | ||
| 49 | #include <setjmp.h> | 48 | #include <setjmp.h> |
| 50 | #include "lisp.h" | 49 | #include "lisp.h" |
| 51 | #include "syssignal.h" | 50 | #include "syssignal.h" |
diff --git a/src/gtkutil.c b/src/gtkutil.c index 3bce5be9cd0..884574e1062 100644 --- a/src/gtkutil.c +++ b/src/gtkutil.c | |||
| @@ -21,7 +21,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ | |||
| 21 | 21 | ||
| 22 | #ifdef USE_GTK | 22 | #ifdef USE_GTK |
| 23 | #include <float.h> | 23 | #include <float.h> |
| 24 | #include <signal.h> | ||
| 25 | #include <stdio.h> | 24 | #include <stdio.h> |
| 26 | #include <setjmp.h> | 25 | #include <setjmp.h> |
| 27 | 26 | ||
| @@ -1979,7 +1978,10 @@ xg_get_file_name (FRAME_PTR f, | |||
| 1979 | /* I really don't know why this is needed, but without this the GLIBC add on | 1978 | /* I really don't know why this is needed, but without this the GLIBC add on |
| 1980 | library linuxthreads hangs when the Gnome file chooser backend creates | 1979 | library linuxthreads hangs when the Gnome file chooser backend creates |
| 1981 | threads. */ | 1980 | threads. */ |
| 1982 | sigblock (sigmask (__SIGRTMIN)); | 1981 | sigset_t blocked; |
| 1982 | sigemptyset (&blocked); | ||
| 1983 | sigaddset (&blocked, __SIGRTMIN); | ||
| 1984 | pthread_sigmask (SIG_BLOCK, &blocked, 0); | ||
| 1983 | #endif /* HAVE_PTHREAD */ | 1985 | #endif /* HAVE_PTHREAD */ |
| 1984 | 1986 | ||
| 1985 | #ifdef HAVE_GTK_FILE_SELECTION_NEW | 1987 | #ifdef HAVE_GTK_FILE_SELECTION_NEW |
| @@ -2001,7 +2003,7 @@ xg_get_file_name (FRAME_PTR f, | |||
| 2001 | filesel_done = xg_dialog_run (f, w); | 2003 | filesel_done = xg_dialog_run (f, w); |
| 2002 | 2004 | ||
| 2003 | #if defined (HAVE_PTHREAD) && defined (__SIGRTMIN) | 2005 | #if defined (HAVE_PTHREAD) && defined (__SIGRTMIN) |
| 2004 | sigunblock (sigmask (__SIGRTMIN)); | 2006 | pthread_sigmask (SIG_UNBLOCK, &blocked, 0); |
| 2005 | #endif | 2007 | #endif |
| 2006 | 2008 | ||
| 2007 | if (filesel_done == GTK_RESPONSE_OK) | 2009 | if (filesel_done == GTK_RESPONSE_OK) |
| @@ -2057,7 +2059,10 @@ xg_get_font (FRAME_PTR f, const char *default_name) | |||
| 2057 | Lisp_Object font = Qnil; | 2059 | Lisp_Object font = Qnil; |
| 2058 | 2060 | ||
| 2059 | #if defined (HAVE_PTHREAD) && defined (__SIGRTMIN) | 2061 | #if defined (HAVE_PTHREAD) && defined (__SIGRTMIN) |
| 2060 | sigblock (sigmask (__SIGRTMIN)); | 2062 | sigset_t blocked; |
| 2063 | sigemptyset (&blocked); | ||
| 2064 | sigaddset (&blocked, __SIGRTMIN); | ||
| 2065 | pthread_sigmask (SIG_BLOCK, &blocked, 0); | ||
| 2061 | #endif /* HAVE_PTHREAD */ | 2066 | #endif /* HAVE_PTHREAD */ |
| 2062 | 2067 | ||
| 2063 | w = gtk_font_chooser_dialog_new | 2068 | w = gtk_font_chooser_dialog_new |
| @@ -2086,7 +2091,7 @@ xg_get_font (FRAME_PTR f, const char *default_name) | |||
| 2086 | done = xg_dialog_run (f, w); | 2091 | done = xg_dialog_run (f, w); |
| 2087 | 2092 | ||
| 2088 | #if defined (HAVE_PTHREAD) && defined (__SIGRTMIN) | 2093 | #if defined (HAVE_PTHREAD) && defined (__SIGRTMIN) |
| 2089 | sigunblock (sigmask (__SIGRTMIN)); | 2094 | pthread_sigmask (SIG_UNBLOCK, &blocked, 0); |
| 2090 | #endif | 2095 | #endif |
| 2091 | 2096 | ||
| 2092 | if (done == GTK_RESPONSE_OK) | 2097 | if (done == GTK_RESPONSE_OK) |
diff --git a/src/keyboard.c b/src/keyboard.c index 128f9280911..d26cf35e108 100644 --- a/src/keyboard.c +++ b/src/keyboard.c | |||
| @@ -21,7 +21,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ | |||
| 21 | 21 | ||
| 22 | #define KEYBOARD_INLINE EXTERN_INLINE | 22 | #define KEYBOARD_INLINE EXTERN_INLINE |
| 23 | 23 | ||
| 24 | #include <signal.h> | ||
| 25 | #include <stdio.h> | 24 | #include <stdio.h> |
| 26 | #include <setjmp.h> | 25 | #include <setjmp.h> |
| 27 | #include "lisp.h" | 26 | #include "lisp.h" |
| @@ -3680,7 +3679,7 @@ kbd_buffer_store_event_hold (register struct input_event *event, | |||
| 3680 | if (immediate_quit && NILP (Vinhibit_quit)) | 3679 | if (immediate_quit && NILP (Vinhibit_quit)) |
| 3681 | { | 3680 | { |
| 3682 | immediate_quit = 0; | 3681 | immediate_quit = 0; |
| 3683 | sigfree (); | 3682 | pthread_sigmask (SIG_SETMASK, &empty_mask, 0); |
| 3684 | QUIT; | 3683 | QUIT; |
| 3685 | } | 3684 | } |
| 3686 | } | 3685 | } |
| @@ -3832,7 +3831,11 @@ kbd_buffer_get_event (KBOARD **kbp, | |||
| 3832 | unhold_keyboard_input (); | 3831 | unhold_keyboard_input (); |
| 3833 | #ifdef SIGIO | 3832 | #ifdef SIGIO |
| 3834 | if (!noninteractive) | 3833 | if (!noninteractive) |
| 3835 | signal (SIGIO, deliver_input_available_signal); | 3834 | { |
| 3835 | struct sigaction action; | ||
| 3836 | emacs_sigaction_init (&action, deliver_input_available_signal); | ||
| 3837 | sigaction (SIGIO, &action, 0); | ||
| 3838 | } | ||
| 3836 | #endif /* SIGIO */ | 3839 | #endif /* SIGIO */ |
| 3837 | start_polling (); | 3840 | start_polling (); |
| 3838 | } | 3841 | } |
| @@ -6780,10 +6783,12 @@ gobble_input (int expected) | |||
| 6780 | #ifdef SIGIO | 6783 | #ifdef SIGIO |
| 6781 | if (interrupt_input) | 6784 | if (interrupt_input) |
| 6782 | { | 6785 | { |
| 6783 | SIGMASKTYPE mask; | 6786 | sigset_t blocked, procmask; |
| 6784 | mask = sigblock (sigmask (SIGIO)); | 6787 | sigemptyset (&blocked); |
| 6788 | sigaddset (&blocked, SIGIO); | ||
| 6789 | pthread_sigmask (SIG_BLOCK, &blocked, &procmask); | ||
| 6785 | read_avail_input (expected); | 6790 | read_avail_input (expected); |
| 6786 | sigsetmask (mask); | 6791 | pthread_sigmask (SIG_SETMASK, &procmask, 0); |
| 6787 | } | 6792 | } |
| 6788 | else | 6793 | else |
| 6789 | #ifdef POLL_FOR_INPUT | 6794 | #ifdef POLL_FOR_INPUT |
| @@ -6792,10 +6797,12 @@ gobble_input (int expected) | |||
| 6792 | it's always set. */ | 6797 | it's always set. */ |
| 6793 | if (!interrupt_input && poll_suppress_count == 0) | 6798 | if (!interrupt_input && poll_suppress_count == 0) |
| 6794 | { | 6799 | { |
| 6795 | SIGMASKTYPE mask; | 6800 | sigset_t blocked, procmask; |
| 6796 | mask = sigblock (sigmask (SIGALRM)); | 6801 | sigemptyset (&blocked); |
| 6802 | sigaddset (&blocked, SIGALRM); | ||
| 6803 | pthread_sigmask (SIG_BLOCK, &blocked, &procmask); | ||
| 6797 | read_avail_input (expected); | 6804 | read_avail_input (expected); |
| 6798 | sigsetmask (mask); | 6805 | pthread_sigmask (SIG_SETMASK, &procmask, 0); |
| 6799 | } | 6806 | } |
| 6800 | else | 6807 | else |
| 6801 | #endif | 6808 | #endif |
| @@ -6831,10 +6838,12 @@ record_asynch_buffer_change (void) | |||
| 6831 | #ifdef SIGIO | 6838 | #ifdef SIGIO |
| 6832 | if (interrupt_input) | 6839 | if (interrupt_input) |
| 6833 | { | 6840 | { |
| 6834 | SIGMASKTYPE mask; | 6841 | sigset_t blocked, procmask; |
| 6835 | mask = sigblock (sigmask (SIGIO)); | 6842 | sigemptyset (&blocked); |
| 6843 | sigaddset (&blocked, SIGIO); | ||
| 6844 | pthread_sigmask (SIG_BLOCK, &blocked, &procmask); | ||
| 6836 | kbd_buffer_store_event (&event); | 6845 | kbd_buffer_store_event (&event); |
| 6837 | sigsetmask (mask); | 6846 | pthread_sigmask (SIG_SETMASK, &procmask, 0); |
| 6838 | } | 6847 | } |
| 6839 | else | 6848 | else |
| 6840 | #endif | 6849 | #endif |
| @@ -7295,6 +7304,7 @@ static struct user_signal_info *user_signals = NULL; | |||
| 7295 | void | 7304 | void |
| 7296 | add_user_signal (int sig, const char *name) | 7305 | add_user_signal (int sig, const char *name) |
| 7297 | { | 7306 | { |
| 7307 | struct sigaction action; | ||
| 7298 | struct user_signal_info *p; | 7308 | struct user_signal_info *p; |
| 7299 | 7309 | ||
| 7300 | for (p = user_signals; p; p = p->next) | 7310 | for (p = user_signals; p; p = p->next) |
| @@ -7309,7 +7319,8 @@ add_user_signal (int sig, const char *name) | |||
| 7309 | p->next = user_signals; | 7319 | p->next = user_signals; |
| 7310 | user_signals = p; | 7320 | user_signals = p; |
| 7311 | 7321 | ||
| 7312 | signal (sig, deliver_user_signal); | 7322 | emacs_sigaction_init (&action, deliver_user_signal); |
| 7323 | sigaction (sig, &action, 0); | ||
| 7313 | } | 7324 | } |
| 7314 | 7325 | ||
| 7315 | static void | 7326 | static void |
| @@ -7381,7 +7392,7 @@ store_user_signal_events (void) | |||
| 7381 | for (p = user_signals; p; p = p->next) | 7392 | for (p = user_signals; p; p = p->next) |
| 7382 | if (p->npending > 0) | 7393 | if (p->npending > 0) |
| 7383 | { | 7394 | { |
| 7384 | SIGMASKTYPE mask; | 7395 | sigset_t blocked, procmask; |
| 7385 | 7396 | ||
| 7386 | if (nstored == 0) | 7397 | if (nstored == 0) |
| 7387 | { | 7398 | { |
| @@ -7391,7 +7402,10 @@ store_user_signal_events (void) | |||
| 7391 | } | 7402 | } |
| 7392 | nstored += p->npending; | 7403 | nstored += p->npending; |
| 7393 | 7404 | ||
| 7394 | mask = sigblock (sigmask (p->sig)); | 7405 | sigemptyset (&blocked); |
| 7406 | sigaddset (&blocked, p->sig); | ||
| 7407 | pthread_sigmask (SIG_BLOCK, &blocked, &procmask); | ||
| 7408 | |||
| 7395 | do | 7409 | do |
| 7396 | { | 7410 | { |
| 7397 | buf.code = p->sig; | 7411 | buf.code = p->sig; |
| @@ -7399,7 +7413,8 @@ store_user_signal_events (void) | |||
| 7399 | p->npending--; | 7413 | p->npending--; |
| 7400 | } | 7414 | } |
| 7401 | while (p->npending > 0); | 7415 | while (p->npending > 0); |
| 7402 | sigsetmask (mask); | 7416 | |
| 7417 | pthread_sigmask (SIG_SETMASK, &procmask, 0); | ||
| 7403 | } | 7418 | } |
| 7404 | 7419 | ||
| 7405 | return nstored; | 7420 | return nstored; |
| @@ -10838,7 +10853,10 @@ handle_interrupt (void) | |||
| 10838 | /* If SIGINT isn't blocked, don't let us be interrupted by | 10853 | /* If SIGINT isn't blocked, don't let us be interrupted by |
| 10839 | another SIGINT, it might be harmful due to non-reentrancy | 10854 | another SIGINT, it might be harmful due to non-reentrancy |
| 10840 | in I/O functions. */ | 10855 | in I/O functions. */ |
| 10841 | sigblock (sigmask (SIGINT)); | 10856 | sigset_t blocked; |
| 10857 | sigemptyset (&blocked); | ||
| 10858 | sigaddset (&blocked, SIGINT); | ||
| 10859 | pthread_sigmask (SIG_BLOCK, &blocked, 0); | ||
| 10842 | 10860 | ||
| 10843 | fflush (stdout); | 10861 | fflush (stdout); |
| 10844 | reset_all_sys_modes (); | 10862 | reset_all_sys_modes (); |
| @@ -10909,7 +10927,7 @@ handle_interrupt (void) | |||
| 10909 | #endif /* not MSDOS */ | 10927 | #endif /* not MSDOS */ |
| 10910 | fflush (stdout); | 10928 | fflush (stdout); |
| 10911 | init_all_sys_modes (); | 10929 | init_all_sys_modes (); |
| 10912 | sigfree (); | 10930 | pthread_sigmask (SIG_SETMASK, &empty_mask, 0); |
| 10913 | } | 10931 | } |
| 10914 | else | 10932 | else |
| 10915 | { | 10933 | { |
| @@ -10922,7 +10940,7 @@ handle_interrupt (void) | |||
| 10922 | struct gcpro gcpro1, gcpro2, gcpro3, gcpro4; | 10940 | struct gcpro gcpro1, gcpro2, gcpro3, gcpro4; |
| 10923 | 10941 | ||
| 10924 | immediate_quit = 0; | 10942 | immediate_quit = 0; |
| 10925 | sigfree (); | 10943 | pthread_sigmask (SIG_SETMASK, &empty_mask, 0); |
| 10926 | saved = gl_state; | 10944 | saved = gl_state; |
| 10927 | GCPRO4 (saved.object, saved.global_code, | 10945 | GCPRO4 (saved.object, saved.global_code, |
| 10928 | saved.current_syntax_table, saved.old_prop); | 10946 | saved.current_syntax_table, saved.old_prop); |
| @@ -10967,7 +10985,7 @@ quit_throw_to_read_char (int from_signal) | |||
| 10967 | if (!from_signal && EQ (Vquit_flag, Qkill_emacs)) | 10985 | if (!from_signal && EQ (Vquit_flag, Qkill_emacs)) |
| 10968 | Fkill_emacs (Qnil); | 10986 | Fkill_emacs (Qnil); |
| 10969 | 10987 | ||
| 10970 | sigfree (); | 10988 | pthread_sigmask (SIG_SETMASK, &empty_mask, 0); |
| 10971 | /* Prevent another signal from doing this before we finish. */ | 10989 | /* Prevent another signal from doing this before we finish. */ |
| 10972 | clear_waiting_for_input (); | 10990 | clear_waiting_for_input (); |
| 10973 | input_pending = 0; | 10991 | input_pending = 0; |
| @@ -11402,17 +11420,23 @@ init_keyboard (void) | |||
| 11402 | SIGINT. There is special code in interrupt_signal to exit | 11420 | SIGINT. There is special code in interrupt_signal to exit |
| 11403 | Emacs on SIGINT when there are no termcap frames on the | 11421 | Emacs on SIGINT when there are no termcap frames on the |
| 11404 | controlling terminal. */ | 11422 | controlling terminal. */ |
| 11405 | signal (SIGINT, deliver_interrupt_signal); | 11423 | struct sigaction action; |
| 11424 | emacs_sigaction_init (&action, deliver_interrupt_signal); | ||
| 11425 | sigaction (SIGINT, &action, 0); | ||
| 11406 | #ifndef DOS_NT | 11426 | #ifndef DOS_NT |
| 11407 | /* For systems with SysV TERMIO, C-g is set up for both SIGINT and | 11427 | /* For systems with SysV TERMIO, C-g is set up for both SIGINT and |
| 11408 | SIGQUIT and we can't tell which one it will give us. */ | 11428 | SIGQUIT and we can't tell which one it will give us. */ |
| 11409 | signal (SIGQUIT, deliver_interrupt_signal); | 11429 | sigaction (SIGQUIT, &action, 0); |
| 11410 | #endif /* not DOS_NT */ | 11430 | #endif /* not DOS_NT */ |
| 11411 | } | 11431 | } |
| 11412 | /* Note SIGIO has been undef'd if FIONREAD is missing. */ | 11432 | /* Note SIGIO has been undef'd if FIONREAD is missing. */ |
| 11413 | #ifdef SIGIO | 11433 | #ifdef SIGIO |
| 11414 | if (!noninteractive) | 11434 | if (!noninteractive) |
| 11415 | signal (SIGIO, deliver_input_available_signal); | 11435 | { |
| 11436 | struct sigaction action; | ||
| 11437 | emacs_sigaction_init (&action, deliver_input_available_signal); | ||
| 11438 | sigaction (SIGIO, &action, 0); | ||
| 11439 | } | ||
| 11416 | #endif /* SIGIO */ | 11440 | #endif /* SIGIO */ |
| 11417 | 11441 | ||
| 11418 | /* Use interrupt input by default, if it works and noninterrupt input | 11442 | /* Use interrupt input by default, if it works and noninterrupt input |
| @@ -11424,7 +11448,7 @@ init_keyboard (void) | |||
| 11424 | interrupt_input = 0; | 11448 | interrupt_input = 0; |
| 11425 | #endif | 11449 | #endif |
| 11426 | 11450 | ||
| 11427 | sigfree (); | 11451 | pthread_sigmask (SIG_SETMASK, &empty_mask, 0); |
| 11428 | dribble = 0; | 11452 | dribble = 0; |
| 11429 | 11453 | ||
| 11430 | if (keyboard_init_hook) | 11454 | if (keyboard_init_hook) |
diff --git a/src/nsfns.m b/src/nsfns.m index e8b5d22077a..f73086eeee9 100644 --- a/src/nsfns.m +++ b/src/nsfns.m | |||
| @@ -30,7 +30,6 @@ GNUstep port and post-20 update by Adrian Robert (arobert@cogsci.ucsd.edu) | |||
| 30 | interpretation of even the system includes. */ | 30 | interpretation of even the system includes. */ |
| 31 | #include <config.h> | 31 | #include <config.h> |
| 32 | 32 | ||
| 33 | #include <signal.h> | ||
| 34 | #include <math.h> | 33 | #include <math.h> |
| 35 | #include <setjmp.h> | 34 | #include <setjmp.h> |
| 36 | #include <c-strcase.h> | 35 | #include <c-strcase.h> |
diff --git a/src/process.c b/src/process.c index 9ab8d2720b2..0cc9bc353a1 100644 --- a/src/process.c +++ b/src/process.c | |||
| @@ -23,7 +23,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ | |||
| 23 | 23 | ||
| 24 | #define PROCESS_INLINE EXTERN_INLINE | 24 | #define PROCESS_INLINE EXTERN_INLINE |
| 25 | 25 | ||
| 26 | #include <signal.h> | ||
| 27 | #include <stdio.h> | 26 | #include <stdio.h> |
| 28 | #include <errno.h> | 27 | #include <errno.h> |
| 29 | #include <setjmp.h> | 28 | #include <setjmp.h> |
| @@ -1612,8 +1611,7 @@ create_process (Lisp_Object process, char **new_argv, Lisp_Object current_dir) | |||
| 1612 | #if !defined (WINDOWSNT) && defined (FD_CLOEXEC) | 1611 | #if !defined (WINDOWSNT) && defined (FD_CLOEXEC) |
| 1613 | int wait_child_setup[2]; | 1612 | int wait_child_setup[2]; |
| 1614 | #endif | 1613 | #endif |
| 1615 | sigset_t procmask; | 1614 | sigset_t blocked, procmask; |
| 1616 | sigset_t blocked; | ||
| 1617 | struct sigaction sigint_action; | 1615 | struct sigaction sigint_action; |
| 1618 | struct sigaction sigquit_action; | 1616 | struct sigaction sigquit_action; |
| 1619 | struct sigaction sigpipe_action; | 1617 | struct sigaction sigpipe_action; |
| @@ -1765,12 +1763,6 @@ create_process (Lisp_Object process, char **new_argv, Lisp_Object current_dir) | |||
| 1765 | int xforkin = forkin; | 1763 | int xforkin = forkin; |
| 1766 | int xforkout = forkout; | 1764 | int xforkout = forkout; |
| 1767 | 1765 | ||
| 1768 | #if 0 /* This was probably a mistake--it duplicates code later on, | ||
| 1769 | but fails to handle all the cases. */ | ||
| 1770 | /* Make sure SIGCHLD is not blocked in the child. */ | ||
| 1771 | sigsetmask (SIGEMPTYMASK); | ||
| 1772 | #endif | ||
| 1773 | |||
| 1774 | /* Make the pty be the controlling terminal of the process. */ | 1766 | /* Make the pty be the controlling terminal of the process. */ |
| 1775 | #ifdef HAVE_PTYS | 1767 | #ifdef HAVE_PTYS |
| 1776 | /* First, disconnect its current controlling terminal. */ | 1768 | /* First, disconnect its current controlling terminal. */ |
| @@ -5434,7 +5426,10 @@ static Lisp_Object process_sent_to; | |||
| 5434 | static _Noreturn void | 5426 | static _Noreturn void |
| 5435 | handle_pipe_signal (int sig) | 5427 | handle_pipe_signal (int sig) |
| 5436 | { | 5428 | { |
| 5437 | sigunblock (sigmask (SIGPIPE)); | 5429 | sigset_t unblocked; |
| 5430 | sigemptyset (&unblocked); | ||
| 5431 | sigaddset (&unblocked, SIGPIPE); | ||
| 5432 | pthread_sigmask (SIG_UNBLOCK, &unblocked, 0); | ||
| 5438 | _longjmp (send_process_frame, 1); | 5433 | _longjmp (send_process_frame, 1); |
| 5439 | } | 5434 | } |
| 5440 | 5435 | ||
| @@ -5534,7 +5529,7 @@ send_process (volatile Lisp_Object proc, const char *volatile buf, | |||
| 5534 | struct Lisp_Process *p = XPROCESS (proc); | 5529 | struct Lisp_Process *p = XPROCESS (proc); |
| 5535 | ssize_t rv; | 5530 | ssize_t rv; |
| 5536 | struct coding_system *coding; | 5531 | struct coding_system *coding; |
| 5537 | void (*volatile old_sigpipe) (int); | 5532 | struct sigaction old_sigpipe_action; |
| 5538 | 5533 | ||
| 5539 | if (p->raw_status_new) | 5534 | if (p->raw_status_new) |
| 5540 | update_status (p); | 5535 | update_status (p); |
| @@ -5673,7 +5668,9 @@ send_process (volatile Lisp_Object proc, const char *volatile buf, | |||
| 5673 | /* Send this batch, using one or more write calls. */ | 5668 | /* Send this batch, using one or more write calls. */ |
| 5674 | ptrdiff_t written = 0; | 5669 | ptrdiff_t written = 0; |
| 5675 | int outfd = p->outfd; | 5670 | int outfd = p->outfd; |
| 5676 | old_sigpipe = signal (SIGPIPE, deliver_pipe_signal); | 5671 | struct sigaction action; |
| 5672 | emacs_sigaction_init (&action, deliver_pipe_signal); | ||
| 5673 | sigaction (SIGPIPE, &action, &old_sigpipe_action); | ||
| 5677 | #ifdef DATAGRAM_SOCKETS | 5674 | #ifdef DATAGRAM_SOCKETS |
| 5678 | if (DATAGRAM_CHAN_P (outfd)) | 5675 | if (DATAGRAM_CHAN_P (outfd)) |
| 5679 | { | 5676 | { |
| @@ -5684,7 +5681,7 @@ send_process (volatile Lisp_Object proc, const char *volatile buf, | |||
| 5684 | written = rv; | 5681 | written = rv; |
| 5685 | else if (errno == EMSGSIZE) | 5682 | else if (errno == EMSGSIZE) |
| 5686 | { | 5683 | { |
| 5687 | signal (SIGPIPE, old_sigpipe); | 5684 | sigaction (SIGPIPE, &old_sigpipe_action, 0); |
| 5688 | report_file_error ("sending datagram", | 5685 | report_file_error ("sending datagram", |
| 5689 | Fcons (proc, Qnil)); | 5686 | Fcons (proc, Qnil)); |
| 5690 | } | 5687 | } |
| @@ -5709,7 +5706,7 @@ send_process (volatile Lisp_Object proc, const char *volatile buf, | |||
| 5709 | } | 5706 | } |
| 5710 | #endif | 5707 | #endif |
| 5711 | } | 5708 | } |
| 5712 | signal (SIGPIPE, old_sigpipe); | 5709 | sigaction (SIGPIPE, &old_sigpipe_action, 0); |
| 5713 | 5710 | ||
| 5714 | if (rv < 0) | 5711 | if (rv < 0) |
| 5715 | { | 5712 | { |
| @@ -5769,7 +5766,7 @@ send_process (volatile Lisp_Object proc, const char *volatile buf, | |||
| 5769 | } | 5766 | } |
| 5770 | else | 5767 | else |
| 5771 | { | 5768 | { |
| 5772 | signal (SIGPIPE, old_sigpipe); | 5769 | sigaction (SIGPIPE, &old_sigpipe_action, 0); |
| 5773 | proc = process_sent_to; | 5770 | proc = process_sent_to; |
| 5774 | p = XPROCESS (proc); | 5771 | p = XPROCESS (proc); |
| 5775 | p->raw_status_new = 0; | 5772 | p->raw_status_new = 0; |
| @@ -7389,7 +7386,11 @@ init_process_emacs (void) | |||
| 7389 | #ifndef CANNOT_DUMP | 7386 | #ifndef CANNOT_DUMP |
| 7390 | if (! noninteractive || initialized) | 7387 | if (! noninteractive || initialized) |
| 7391 | #endif | 7388 | #endif |
| 7392 | signal (SIGCHLD, deliver_child_signal); | 7389 | { |
| 7390 | struct sigaction action; | ||
| 7391 | emacs_sigaction_init (&action, deliver_child_signal); | ||
| 7392 | sigaction (SIGCHLD, &action, 0); | ||
| 7393 | } | ||
| 7393 | #endif | 7394 | #endif |
| 7394 | 7395 | ||
| 7395 | FD_ZERO (&input_wait_mask); | 7396 | FD_ZERO (&input_wait_mask); |
diff --git a/src/sound.c b/src/sound.c index d20fa5ee8eb..5729d704b6a 100644 --- a/src/sound.c +++ b/src/sound.c | |||
| @@ -48,7 +48,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ | |||
| 48 | #include "lisp.h" | 48 | #include "lisp.h" |
| 49 | #include "dispextern.h" | 49 | #include "dispextern.h" |
| 50 | #include "atimer.h" | 50 | #include "atimer.h" |
| 51 | #include <signal.h> | ||
| 52 | #include "syssignal.h" | 51 | #include "syssignal.h" |
| 53 | /* END: Common Includes */ | 52 | /* END: Common Includes */ |
| 54 | 53 | ||
| @@ -316,7 +315,12 @@ sound_perror (const char *msg) | |||
| 316 | 315 | ||
| 317 | turn_on_atimers (1); | 316 | turn_on_atimers (1); |
| 318 | #ifdef SIGIO | 317 | #ifdef SIGIO |
| 319 | sigunblock (sigmask (SIGIO)); | 318 | { |
| 319 | sigset_t unblocked; | ||
| 320 | sigemptyset (&unblocked); | ||
| 321 | sigaddset (&unblocked, SIGIO); | ||
| 322 | pthread_sigmask (SIG_UNBLOCK, &unblocked, 0); | ||
| 323 | } | ||
| 320 | #endif | 324 | #endif |
| 321 | if (saved_errno != 0) | 325 | if (saved_errno != 0) |
| 322 | error ("%s: %s", msg, strerror (saved_errno)); | 326 | error ("%s: %s", msg, strerror (saved_errno)); |
| @@ -728,6 +732,9 @@ static void | |||
| 728 | vox_configure (struct sound_device *sd) | 732 | vox_configure (struct sound_device *sd) |
| 729 | { | 733 | { |
| 730 | int val; | 734 | int val; |
| 735 | #ifdef SIGIO | ||
| 736 | sigset_t blocked; | ||
| 737 | #endif | ||
| 731 | 738 | ||
| 732 | eassert (sd->fd >= 0); | 739 | eassert (sd->fd >= 0); |
| 733 | 740 | ||
| @@ -736,7 +743,9 @@ vox_configure (struct sound_device *sd) | |||
| 736 | troubles. */ | 743 | troubles. */ |
| 737 | turn_on_atimers (0); | 744 | turn_on_atimers (0); |
| 738 | #ifdef SIGIO | 745 | #ifdef SIGIO |
| 739 | sigblock (sigmask (SIGIO)); | 746 | sigemptyset (&blocked); |
| 747 | sigaddset (&blocked, SIGIO); | ||
| 748 | pthread_sigmask (SIG_BLOCK, &blocked, 0); | ||
| 740 | #endif | 749 | #endif |
| 741 | 750 | ||
| 742 | val = sd->format; | 751 | val = sd->format; |
| @@ -770,7 +779,7 @@ vox_configure (struct sound_device *sd) | |||
| 770 | 779 | ||
| 771 | turn_on_atimers (1); | 780 | turn_on_atimers (1); |
| 772 | #ifdef SIGIO | 781 | #ifdef SIGIO |
| 773 | sigunblock (sigmask (SIGIO)); | 782 | pthread_sigmask (SIG_UNBLOCK, &blocked, 0); |
| 774 | #endif | 783 | #endif |
| 775 | } | 784 | } |
| 776 | 785 | ||
| @@ -786,7 +795,10 @@ vox_close (struct sound_device *sd) | |||
| 786 | be interrupted by a signal. Block the ones we know to cause | 795 | be interrupted by a signal. Block the ones we know to cause |
| 787 | troubles. */ | 796 | troubles. */ |
| 788 | #ifdef SIGIO | 797 | #ifdef SIGIO |
| 789 | sigblock (sigmask (SIGIO)); | 798 | sigset_t blocked; |
| 799 | sigemptyset (&blocked); | ||
| 800 | sigaddset (&blocked, SIGIO); | ||
| 801 | pthread_sigmask (SIG_BLOCK, &blocked, 0); | ||
| 790 | #endif | 802 | #endif |
| 791 | turn_on_atimers (0); | 803 | turn_on_atimers (0); |
| 792 | 804 | ||
| @@ -795,7 +807,7 @@ vox_close (struct sound_device *sd) | |||
| 795 | 807 | ||
| 796 | turn_on_atimers (1); | 808 | turn_on_atimers (1); |
| 797 | #ifdef SIGIO | 809 | #ifdef SIGIO |
| 798 | sigunblock (sigmask (SIGIO)); | 810 | pthread_sigmask (SIG_UNBLOCK, &blocked, 0); |
| 799 | #endif | 811 | #endif |
| 800 | 812 | ||
| 801 | /* Close the device. */ | 813 | /* Close the device. */ |
diff --git a/src/sysdep.c b/src/sysdep.c index 42b8baf78e0..0f16d1a7645 100644 --- a/src/sysdep.c +++ b/src/sysdep.c | |||
| @@ -22,7 +22,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ | |||
| 22 | #define SYSTIME_INLINE EXTERN_INLINE | 22 | #define SYSTIME_INLINE EXTERN_INLINE |
| 23 | 23 | ||
| 24 | #include <execinfo.h> | 24 | #include <execinfo.h> |
| 25 | #include <signal.h> | ||
| 26 | #include <stdio.h> | 25 | #include <stdio.h> |
| 27 | #include <setjmp.h> | 26 | #include <setjmp.h> |
| 28 | #ifdef HAVE_PWD_H | 27 | #ifdef HAVE_PWD_H |
| @@ -303,27 +302,34 @@ wait_for_termination_1 (pid_t pid, int interruptible) | |||
| 303 | termination of subprocesses, perhaps involving a kernel bug too, | 302 | termination of subprocesses, perhaps involving a kernel bug too, |
| 304 | but no idea what it is. Just as a hunch we signal SIGCHLD to see | 303 | but no idea what it is. Just as a hunch we signal SIGCHLD to see |
| 305 | if that causes the problem to go away or get worse. */ | 304 | if that causes the problem to go away or get worse. */ |
| 306 | sigsetmask (sigmask (SIGCHLD)); | 305 | sigset_t sigchild_mask; |
| 306 | sigemptyset (&sigchild_mask); | ||
| 307 | sigaddset (&sigchild_mask, SIGCHLD); | ||
| 308 | pthread_sigmask (SIG_SETMASK, &sigchild_mask, 0); | ||
| 309 | |||
| 307 | if (0 > kill (pid, 0)) | 310 | if (0 > kill (pid, 0)) |
| 308 | { | 311 | { |
| 309 | sigsetmask (SIGEMPTYMASK); | 312 | pthread_sigmask (SIG_SETMASK, &empty_mask, 0); |
| 310 | kill (getpid (), SIGCHLD); | 313 | kill (getpid (), SIGCHLD); |
| 311 | break; | 314 | break; |
| 312 | } | 315 | } |
| 313 | if (wait_debugging) | 316 | if (wait_debugging) |
| 314 | sleep (1); | 317 | sleep (1); |
| 315 | else | 318 | else |
| 316 | sigpause (SIGEMPTYMASK); | 319 | sigsuspend (&empty_mask); |
| 317 | #else /* not BSD_SYSTEM, and not HPUX version >= 6 */ | 320 | #else /* not BSD_SYSTEM, and not HPUX version >= 6 */ |
| 318 | #ifdef WINDOWSNT | 321 | #ifdef WINDOWSNT |
| 319 | wait (0); | 322 | wait (0); |
| 320 | break; | 323 | break; |
| 321 | #else /* not WINDOWSNT */ | 324 | #else /* not WINDOWSNT */ |
| 322 | sigblock (sigmask (SIGCHLD)); | 325 | sigset_t blocked; |
| 326 | sigemptyset (&blocked); | ||
| 327 | sigaddset (&blocked, SIGCHLD); | ||
| 328 | pthread_sigmask (SIG_BLOCK, &blocked, 0); | ||
| 323 | errno = 0; | 329 | errno = 0; |
| 324 | if (kill (pid, 0) == -1 && errno == ESRCH) | 330 | if (kill (pid, 0) == -1 && errno == ESRCH) |
| 325 | { | 331 | { |
| 326 | sigunblock (sigmask (SIGCHLD)); | 332 | pthread_sigmask (SIG_UNBLOCK, &blocked, 0); |
| 327 | break; | 333 | break; |
| 328 | } | 334 | } |
| 329 | 335 | ||
| @@ -457,11 +463,11 @@ child_setup_tty (int out) | |||
| 457 | #endif /* not MSDOS */ | 463 | #endif /* not MSDOS */ |
| 458 | 464 | ||
| 459 | 465 | ||
| 460 | /* Record a signal code and the handler for it. */ | 466 | /* Record a signal code and the action for it. */ |
| 461 | struct save_signal | 467 | struct save_signal |
| 462 | { | 468 | { |
| 463 | int code; | 469 | int code; |
| 464 | void (*handler) (int); | 470 | struct sigaction action; |
| 465 | }; | 471 | }; |
| 466 | 472 | ||
| 467 | static void save_signal_handlers (struct save_signal *); | 473 | static void save_signal_handlers (struct save_signal *); |
| @@ -619,8 +625,9 @@ save_signal_handlers (struct save_signal *saved_handlers) | |||
| 619 | { | 625 | { |
| 620 | while (saved_handlers->code) | 626 | while (saved_handlers->code) |
| 621 | { | 627 | { |
| 622 | saved_handlers->handler | 628 | struct sigaction action; |
| 623 | = (void (*) (int)) signal (saved_handlers->code, SIG_IGN); | 629 | emacs_sigaction_init (&action, SIG_IGN); |
| 630 | sigaction (saved_handlers->code, &action, &saved_handlers->action); | ||
| 624 | saved_handlers++; | 631 | saved_handlers++; |
| 625 | } | 632 | } |
| 626 | } | 633 | } |
| @@ -630,7 +637,7 @@ restore_signal_handlers (struct save_signal *saved_handlers) | |||
| 630 | { | 637 | { |
| 631 | while (saved_handlers->code) | 638 | while (saved_handlers->code) |
| 632 | { | 639 | { |
| 633 | signal (saved_handlers->code, saved_handlers->handler); | 640 | sigaction (saved_handlers->code, &saved_handlers->action, 0); |
| 634 | saved_handlers++; | 641 | saved_handlers++; |
| 635 | } | 642 | } |
| 636 | } | 643 | } |
| @@ -687,13 +694,17 @@ reset_sigio (int fd) | |||
| 687 | void | 694 | void |
| 688 | request_sigio (void) | 695 | request_sigio (void) |
| 689 | { | 696 | { |
| 697 | sigset_t unblocked; | ||
| 698 | |||
| 690 | if (noninteractive) | 699 | if (noninteractive) |
| 691 | return; | 700 | return; |
| 692 | 701 | ||
| 702 | sigemptyset (&unblocked); | ||
| 693 | #ifdef SIGWINCH | 703 | #ifdef SIGWINCH |
| 694 | sigunblock (sigmask (SIGWINCH)); | 704 | sigaddset (&unblocked, SIGWINCH); |
| 695 | #endif | 705 | #endif |
| 696 | sigunblock (sigmask (SIGIO)); | 706 | sigaddset (&unblocked, SIGIO); |
| 707 | pthread_sigmask (SIG_UNBLOCK, &unblocked, 0); | ||
| 697 | 708 | ||
| 698 | interrupts_deferred = 0; | 709 | interrupts_deferred = 0; |
| 699 | } | 710 | } |
| @@ -701,6 +712,8 @@ request_sigio (void) | |||
| 701 | void | 712 | void |
| 702 | unrequest_sigio (void) | 713 | unrequest_sigio (void) |
| 703 | { | 714 | { |
| 715 | sigset_t blocked; | ||
| 716 | |||
| 704 | if (noninteractive) | 717 | if (noninteractive) |
| 705 | return; | 718 | return; |
| 706 | 719 | ||
| @@ -709,10 +722,12 @@ unrequest_sigio (void) | |||
| 709 | return; | 722 | return; |
| 710 | #endif | 723 | #endif |
| 711 | 724 | ||
| 725 | sigemptyset (&blocked); | ||
| 712 | #ifdef SIGWINCH | 726 | #ifdef SIGWINCH |
| 713 | sigblock (sigmask (SIGWINCH)); | 727 | sigaddset (&blocked, SIGWINCH); |
| 714 | #endif | 728 | #endif |
| 715 | sigblock (sigmask (SIGIO)); | 729 | sigaddset (&blocked, SIGIO); |
| 730 | pthread_sigmask (SIG_BLOCK, &blocked, 0); | ||
| 716 | interrupts_deferred = 1; | 731 | interrupts_deferred = 1; |
| 717 | } | 732 | } |
| 718 | 733 | ||
| @@ -1471,20 +1486,16 @@ init_system_name (void) | |||
| 1471 | } | 1486 | } |
| 1472 | } | 1487 | } |
| 1473 | 1488 | ||
| 1474 | /* POSIX signals support - DJB */ | ||
| 1475 | /* Anyone with POSIX signals should have ANSI C declarations */ | ||
| 1476 | |||
| 1477 | sigset_t empty_mask; | 1489 | sigset_t empty_mask; |
| 1478 | 1490 | ||
| 1479 | #ifndef WINDOWSNT | 1491 | /* Store into *ACTION a signal action suitable for Emacs, with handler |
| 1480 | 1492 | HANDLER. */ | |
| 1481 | signal_handler_t | 1493 | void |
| 1482 | sys_signal (int signal_number, signal_handler_t action) | 1494 | emacs_sigaction_init (struct sigaction *action, signal_handler_t handler) |
| 1483 | { | 1495 | { |
| 1484 | struct sigaction new_action, old_action; | 1496 | sigemptyset (&action->sa_mask); |
| 1485 | sigemptyset (&new_action.sa_mask); | 1497 | action->sa_handler = handler; |
| 1486 | new_action.sa_handler = action; | 1498 | action->sa_flags = 0; |
| 1487 | new_action.sa_flags = 0; | ||
| 1488 | #if defined (SA_RESTART) | 1499 | #if defined (SA_RESTART) |
| 1489 | /* Emacs mostly works better with restartable system services. If this | 1500 | /* Emacs mostly works better with restartable system services. If this |
| 1490 | flag exists, we probably want to turn it on here. | 1501 | flag exists, we probably want to turn it on here. |
| @@ -1501,54 +1512,8 @@ sys_signal (int signal_number, signal_handler_t action) | |||
| 1501 | # if defined (BROKEN_SA_RESTART) || defined (SYNC_INPUT) | 1512 | # if defined (BROKEN_SA_RESTART) || defined (SYNC_INPUT) |
| 1502 | if (noninteractive) | 1513 | if (noninteractive) |
| 1503 | # endif | 1514 | # endif |
| 1504 | new_action.sa_flags = SA_RESTART; | 1515 | action->sa_flags = SA_RESTART; |
| 1505 | #endif | 1516 | #endif |
| 1506 | sigaction (signal_number, &new_action, &old_action); | ||
| 1507 | return (old_action.sa_handler); | ||
| 1508 | } | ||
| 1509 | |||
| 1510 | #endif /* WINDOWSNT */ | ||
| 1511 | |||
| 1512 | #ifndef __GNUC__ | ||
| 1513 | /* If we're compiling with GCC, we don't need this function, since it | ||
| 1514 | can be written as a macro. */ | ||
| 1515 | sigset_t | ||
| 1516 | sys_sigmask (int sig) | ||
| 1517 | { | ||
| 1518 | sigset_t mask; | ||
| 1519 | sigemptyset (&mask); | ||
| 1520 | sigaddset (&mask, sig); | ||
| 1521 | return mask; | ||
| 1522 | } | ||
| 1523 | #endif | ||
| 1524 | |||
| 1525 | /* I'd like to have these guys return pointers to the mask storage in here, | ||
| 1526 | but there'd be trouble if the code was saving multiple masks. I'll be | ||
| 1527 | safe and pass the structure. It normally won't be more than 2 bytes | ||
| 1528 | anyhow. - DJB */ | ||
| 1529 | |||
| 1530 | sigset_t | ||
| 1531 | sys_sigblock (sigset_t new_mask) | ||
| 1532 | { | ||
| 1533 | sigset_t old_mask; | ||
| 1534 | pthread_sigmask (SIG_BLOCK, &new_mask, &old_mask); | ||
| 1535 | return (old_mask); | ||
| 1536 | } | ||
| 1537 | |||
| 1538 | sigset_t | ||
| 1539 | sys_sigunblock (sigset_t new_mask) | ||
| 1540 | { | ||
| 1541 | sigset_t old_mask; | ||
| 1542 | pthread_sigmask (SIG_UNBLOCK, &new_mask, &old_mask); | ||
| 1543 | return (old_mask); | ||
| 1544 | } | ||
| 1545 | |||
| 1546 | sigset_t | ||
| 1547 | sys_sigsetmask (sigset_t new_mask) | ||
| 1548 | { | ||
| 1549 | sigset_t old_mask; | ||
| 1550 | pthread_sigmask (SIG_SETMASK, &new_mask, &old_mask); | ||
| 1551 | return (old_mask); | ||
| 1552 | } | 1517 | } |
| 1553 | 1518 | ||
| 1554 | #ifdef FORWARD_SIGNAL_TO_MAIN_THREAD | 1519 | #ifdef FORWARD_SIGNAL_TO_MAIN_THREAD |
diff --git a/src/syssignal.h b/src/syssignal.h index 504aff43083..58290ee3fc7 100644 --- a/src/syssignal.h +++ b/src/syssignal.h | |||
| @@ -17,6 +17,8 @@ GNU General Public License for more details. | |||
| 17 | You should have received a copy of the GNU General Public License | 17 | You should have received a copy of the GNU General Public License |
| 18 | along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ | 18 | along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ |
| 19 | 19 | ||
| 20 | #include <signal.h> | ||
| 21 | |||
| 20 | extern void init_signals (void); | 22 | extern void init_signals (void); |
| 21 | 23 | ||
| 22 | #ifdef HAVE_PTHREAD | 24 | #ifdef HAVE_PTHREAD |
| @@ -26,63 +28,16 @@ extern void init_signals (void); | |||
| 26 | #define FORWARD_SIGNAL_TO_MAIN_THREAD | 28 | #define FORWARD_SIGNAL_TO_MAIN_THREAD |
| 27 | #endif | 29 | #endif |
| 28 | 30 | ||
| 29 | /* Don't #include <signal.h>. That header should always be #included | ||
| 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. */ | ||
| 34 | /* XXX This is not correct anymore, there is a BROKEN_SIGIO macro. */ | ||
| 35 | |||
| 36 | #define SIGMASKTYPE sigset_t | ||
| 37 | |||
| 38 | #define SIGEMPTYMASK (empty_mask) | ||
| 39 | extern sigset_t empty_mask; | 31 | extern sigset_t empty_mask; |
| 40 | 32 | ||
| 41 | /* POSIX pretty much destroys any possibility of writing sigmask as a | ||
| 42 | macro in standard C. We always define our own version because the | ||
| 43 | predefined macro in Glibc 2.1 is only provided for compatibility for old | ||
| 44 | programs that use int as signal mask type. */ | ||
| 45 | #undef sigmask | ||
| 46 | #ifdef __GNUC__ | ||
| 47 | #define sigmask(SIG) \ | ||
| 48 | ({ \ | ||
| 49 | sigset_t _mask; \ | ||
| 50 | sigemptyset (&_mask); \ | ||
| 51 | sigaddset (&_mask, SIG); \ | ||
| 52 | _mask; \ | ||
| 53 | }) | ||
| 54 | #else /* ! defined (__GNUC__) */ | ||
| 55 | extern sigset_t sys_sigmask (); | ||
| 56 | #define sigmask(SIG) (sys_sigmask (SIG)) | ||
| 57 | #endif /* ! defined (__GNUC__) */ | ||
| 58 | |||
| 59 | #undef sigpause | ||
| 60 | #define sigpause(MASK) sigsuspend (&(MASK)) | ||
| 61 | |||
| 62 | #define sigblock(SIG) sys_sigblock (SIG) | ||
| 63 | #define sigunblock(SIG) sys_sigunblock (SIG) | ||
| 64 | #ifndef sigsetmask | ||
| 65 | #define sigsetmask(SIG) sys_sigsetmask (SIG) | ||
| 66 | #endif | ||
| 67 | #undef signal | ||
| 68 | #define signal(SIG,ACT) sys_signal(SIG,ACT) | ||
| 69 | |||
| 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. */ | ||
| 72 | typedef void (*signal_handler_t) (int); | 33 | typedef void (*signal_handler_t) (int); |
| 73 | 34 | ||
| 74 | signal_handler_t sys_signal (int signal_number, signal_handler_t action); | 35 | extern void emacs_sigaction_init (struct sigaction *, signal_handler_t); |
| 75 | sigset_t sys_sigblock (sigset_t new_mask); | 36 | |
| 76 | sigset_t sys_sigunblock (sigset_t new_mask); | ||
| 77 | sigset_t sys_sigsetmask (sigset_t new_mask); | ||
| 78 | #if ! (defined TIOCNOTTY || defined USG5 || defined CYGWIN) | 37 | #if ! (defined TIOCNOTTY || defined USG5 || defined CYGWIN) |
| 79 | _Noreturn void croak (char *); | 38 | _Noreturn void croak (char *); |
| 80 | #endif | 39 | #endif |
| 81 | 40 | ||
| 82 | #define sys_sigdel(MASK,SIG) sigdelset (&MASK,SIG) | ||
| 83 | |||
| 84 | #define sigfree() sigsetmask (SIGEMPTYMASK) | ||
| 85 | |||
| 86 | #if defined (SIGIO) && defined (BROKEN_SIGIO) | 41 | #if defined (SIGIO) && defined (BROKEN_SIGIO) |
| 87 | # undef SIGIO | 42 | # undef SIGIO |
| 88 | #endif | 43 | #endif |
| @@ -97,12 +52,8 @@ _Noreturn void croak (char *); | |||
| 97 | #undef SIGPTY | 52 | #undef SIGPTY |
| 98 | #endif | 53 | #endif |
| 99 | 54 | ||
| 100 | |||
| 101 | /* FIXME? Emacs only defines NSIG_MINIMUM on some platforms? */ | ||
| 102 | #if NSIG < NSIG_MINIMUM | 55 | #if NSIG < NSIG_MINIMUM |
| 103 | # ifdef NSIG | 56 | # undef NSIG |
| 104 | # undef NSIG | ||
| 105 | # endif | ||
| 106 | # define NSIG NSIG_MINIMUM | 57 | # define NSIG NSIG_MINIMUM |
| 107 | #endif | 58 | #endif |
| 108 | 59 | ||
diff --git a/src/term.c b/src/term.c index 8cc5dfd2a87..0eaf76a13df 100644 --- a/src/term.c +++ b/src/term.c | |||
| @@ -25,7 +25,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ | |||
| 25 | #include <sys/file.h> | 25 | #include <sys/file.h> |
| 26 | #include <sys/time.h> | 26 | #include <sys/time.h> |
| 27 | #include <unistd.h> | 27 | #include <unistd.h> |
| 28 | #include <signal.h> | ||
| 29 | #include <setjmp.h> | 28 | #include <setjmp.h> |
| 30 | 29 | ||
| 31 | #include "lisp.h" | 30 | #include "lisp.h" |
| @@ -2932,7 +2931,10 @@ dissociate_if_controlling_tty (int fd) | |||
| 2932 | no_controlling_tty = 1; | 2931 | no_controlling_tty = 1; |
| 2933 | #else | 2932 | #else |
| 2934 | #ifdef TIOCNOTTY /* Try BSD ioctls. */ | 2933 | #ifdef TIOCNOTTY /* Try BSD ioctls. */ |
| 2935 | sigblock (sigmask (SIGTTOU)); | 2934 | sigset_t blocked; |
| 2935 | sigemptyset (&blocked); | ||
| 2936 | sigaddset (&blocked, SIGTTOU); | ||
| 2937 | pthread_sigmask (SIG_BLOCK, &blocked, 0); | ||
| 2936 | fd = emacs_open (DEV_TTY, O_RDWR, 0); | 2938 | fd = emacs_open (DEV_TTY, O_RDWR, 0); |
| 2937 | if (fd != -1 && ioctl (fd, TIOCNOTTY, 0) != -1) | 2939 | if (fd != -1 && ioctl (fd, TIOCNOTTY, 0) != -1) |
| 2938 | { | 2940 | { |
| @@ -2940,7 +2942,7 @@ dissociate_if_controlling_tty (int fd) | |||
| 2940 | } | 2942 | } |
| 2941 | if (fd != -1) | 2943 | if (fd != -1) |
| 2942 | emacs_close (fd); | 2944 | emacs_close (fd); |
| 2943 | sigunblock (sigmask (SIGTTOU)); | 2945 | pthread_sigmask (SIG_UNBLOCK, &blocked, 0); |
| 2944 | #else | 2946 | #else |
| 2945 | /* Unknown system. */ | 2947 | /* Unknown system. */ |
| 2946 | croak (); | 2948 | croak (); |
| @@ -3074,9 +3076,14 @@ init_tty (const char *name, const char *terminal_type, int must_succeed) | |||
| 3074 | 3076 | ||
| 3075 | /* On some systems, tgetent tries to access the controlling | 3077 | /* On some systems, tgetent tries to access the controlling |
| 3076 | terminal. */ | 3078 | terminal. */ |
| 3077 | sigblock (sigmask (SIGTTOU)); | 3079 | { |
| 3078 | status = tgetent (tty->termcap_term_buffer, terminal_type); | 3080 | sigset_t blocked; |
| 3079 | sigunblock (sigmask (SIGTTOU)); | 3081 | sigemptyset (&blocked); |
| 3082 | sigaddset (&blocked, SIGTTOU); | ||
| 3083 | pthread_sigmask (SIG_BLOCK, &blocked, 0); | ||
| 3084 | status = tgetent (tty->termcap_term_buffer, terminal_type); | ||
| 3085 | pthread_sigmask (SIG_UNBLOCK, &blocked, 0); | ||
| 3086 | } | ||
| 3080 | 3087 | ||
| 3081 | if (status < 0) | 3088 | if (status < 0) |
| 3082 | { | 3089 | { |
diff --git a/src/widget.c b/src/widget.c index 9eaf6d1df6a..0100acc8143 100644 --- a/src/widget.c +++ b/src/widget.c | |||
| @@ -50,9 +50,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ | |||
| 50 | #include <X11/ShellP.h> | 50 | #include <X11/ShellP.h> |
| 51 | #include "../lwlib/lwlib.h" | 51 | #include "../lwlib/lwlib.h" |
| 52 | 52 | ||
| 53 | #include <signal.h> | ||
| 54 | #include "syssignal.h" | ||
| 55 | |||
| 56 | #include "character.h" | 53 | #include "character.h" |
| 57 | #include "font.h" | 54 | #include "font.h" |
| 58 | 55 | ||
diff --git a/src/xmenu.c b/src/xmenu.c index 6f92da1b814..605db13e149 100644 --- a/src/xmenu.c +++ b/src/xmenu.c | |||
| @@ -32,11 +32,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ | |||
| 32 | 32 | ||
| 33 | #include <config.h> | 33 | #include <config.h> |
| 34 | 34 | ||
| 35 | #if 0 /* Why was this included? And without syssignal.h? */ | ||
| 36 | /* On 4.3 this loses if it comes after xterm.h. */ | ||
| 37 | #include <signal.h> | ||
| 38 | #endif | ||
| 39 | |||
| 40 | #include <stdio.h> | 35 | #include <stdio.h> |
| 41 | #include <setjmp.h> | 36 | #include <setjmp.h> |
| 42 | 37 | ||
diff --git a/src/xterm.c b/src/xterm.c index 047b5569bf4..f0f6702cd67 100644 --- a/src/xterm.c +++ b/src/xterm.c | |||
| @@ -21,7 +21,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ | |||
| 21 | /* Xt features made by Fred Pierresteguy. */ | 21 | /* Xt features made by Fred Pierresteguy. */ |
| 22 | 22 | ||
| 23 | #include <config.h> | 23 | #include <config.h> |
| 24 | #include <signal.h> | ||
| 25 | #include <stdio.h> | 24 | #include <stdio.h> |
| 26 | #include <setjmp.h> | 25 | #include <setjmp.h> |
| 27 | 26 | ||
| @@ -29,9 +28,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ | |||
| 29 | 28 | ||
| 30 | #include "lisp.h" | 29 | #include "lisp.h" |
| 31 | #include "blockinput.h" | 30 | #include "blockinput.h" |
| 32 | |||
| 33 | /* Need syssignal.h for various externs and definitions that may be required | ||
| 34 | by some configurations for calls to signal later in this source file. */ | ||
| 35 | #include "syssignal.h" | 31 | #include "syssignal.h" |
| 36 | 32 | ||
| 37 | /* This may include sys/types.h, and that somehow loses | 33 | /* This may include sys/types.h, and that somehow loses |
| @@ -7766,7 +7762,9 @@ x_connection_signal (int signalnum) /* If we don't have an argument, */ | |||
| 7766 | #ifdef USG | 7762 | #ifdef USG |
| 7767 | /* USG systems forget handlers when they are used; | 7763 | /* USG systems forget handlers when they are used; |
| 7768 | must reestablish each time */ | 7764 | must reestablish each time */ |
| 7769 | signal (signalnum, x_connection_signal); | 7765 | struct sigaction action; |
| 7766 | emacs_sigaction_init (&action, x_connection_signal); | ||
| 7767 | sigaction (signalnum, &action, 0); | ||
| 7770 | #endif /* USG */ | 7768 | #endif /* USG */ |
| 7771 | } | 7769 | } |
| 7772 | 7770 | ||
| @@ -7876,10 +7874,15 @@ For details, see etc/PROBLEMS.\n", | |||
| 7876 | } | 7874 | } |
| 7877 | 7875 | ||
| 7878 | /* Ordinary stack unwind doesn't deal with these. */ | 7876 | /* Ordinary stack unwind doesn't deal with these. */ |
| 7877 | { | ||
| 7878 | sigset_t unblocked; | ||
| 7879 | sigemptyset (&unblocked); | ||
| 7879 | #ifdef SIGIO | 7880 | #ifdef SIGIO |
| 7880 | sigunblock (sigmask (SIGIO)); | 7881 | sigaddset (&unblocked, SIGIO); |
| 7881 | #endif | 7882 | #endif |
| 7882 | sigunblock (sigmask (SIGALRM)); | 7883 | sigaddset (&unblocked, SIGALRM); |
| 7884 | pthread_sigmask (SIG_UNBLOCK, &unblocked, 0); | ||
| 7885 | } | ||
| 7883 | TOTALLY_UNBLOCK_INPUT; | 7886 | TOTALLY_UNBLOCK_INPUT; |
| 7884 | 7887 | ||
| 7885 | unbind_to (idx, Qnil); | 7888 | unbind_to (idx, Qnil); |
| @@ -10759,6 +10762,8 @@ x_create_terminal (struct x_display_info *dpyinfo) | |||
| 10759 | void | 10762 | void |
| 10760 | x_initialize (void) | 10763 | x_initialize (void) |
| 10761 | { | 10764 | { |
| 10765 | struct sigaction action; | ||
| 10766 | |||
| 10762 | baud_rate = 19200; | 10767 | baud_rate = 19200; |
| 10763 | 10768 | ||
| 10764 | x_noop_count = 0; | 10769 | x_noop_count = 0; |
| @@ -10805,7 +10810,8 @@ x_initialize (void) | |||
| 10805 | XSetErrorHandler (x_error_handler); | 10810 | XSetErrorHandler (x_error_handler); |
| 10806 | XSetIOErrorHandler (x_io_error_quitter); | 10811 | XSetIOErrorHandler (x_io_error_quitter); |
| 10807 | 10812 | ||
| 10808 | signal (SIGPIPE, x_connection_signal); | 10813 | emacs_sigaction_init (&action, x_connection_signal); |
| 10814 | sigaction (SIGPIPE, &action, 0); | ||
| 10809 | } | 10815 | } |
| 10810 | 10816 | ||
| 10811 | 10817 | ||