aboutsummaryrefslogtreecommitdiffstats
path: root/src/xterm.c
diff options
context:
space:
mode:
authorPaul Eggert2012-09-06 18:27:44 -0700
committerPaul Eggert2012-09-06 18:27:44 -0700
commit2fe282993cf9c84f5be424dc93d03f9705a7edd8 (patch)
tree229edb6fe29e66984b2992f3f9fa081cd7fe8920 /src/xterm.c
parent845ce106c0ab157e25416964330875ad6c24b699 (diff)
downloademacs-2fe282993cf9c84f5be424dc93d03f9705a7edd8.tar.gz
emacs-2fe282993cf9c84f5be424dc93d03f9705a7edd8.zip
Signal-handler cleanup.
Emacs's signal handlers were written in the old 4.2BSD style with sigblock and sigmask and so forth, and this led to some inefficiencies and confusion. Rewrite these to use pthread_sigmask etc. without copying signal sets around. Also, get rid of the confusing macros 'SIGNAL_THREAD_CHECK' and 'signal', and instead use functions that do not attempt to take over the system name space. This patch causes Emacs's text segment to shrink by 0.7% on my platform, Fedora 17 x86-64. * configure.ac (PTY_OPEN, PTY_TTY_NAME_SPRINTF): Adjust to syssignal.h changes. (SIGNAL_H_AB): Remove; no longer needed. * src/alloc.c, src/emacsgtkfixed.c, src/nsfns.m, src/widget.c, src/xmenu.c: Do not include <signal.h> or "syssignal.h", as these modules do not use signals. * src/atimer.c, src/callproc.c, src/data.c, src/dispnew.c, src/emacs.c: * src/floatfns.c, src/gtkutil.c, src/keyboard.c, src/process.c, src/sound.c: * src/sysdep.c, src/term.c, src/xterm.c: Do not include <signal.h>, as "syssignal.h" does that for us now. * src/atimer.c (sigmask_atimers): New function. (block_atimers, unblock_atimers): New functions, replacing the old macros BLOCK_ATIMERS and UNBLOCK_ATIMERS. All uses replaced. * src/conf_post.h [SIGNAL_H_AHB]: Do not include <signal.h>; no longer needed here. * src/emacs.c (main): Inspect existing signal handler with sigaction, so that there's no need to block and unblock SIGHUP. * src/sysdep.c (struct save_signal): New member 'action', replacing old member 'handler'. (save_signal_handlers, restore_signal_handlers): Use sigaction instead of 'signal' to save and restore. (get_set_sighandler, set_sighandler) [!WINDOWSNT]: New function. All users of 'signal' modified to use set_sighandler if they're writeonly, and to use sys_signal if they're read+write. (emacs_sigaction_init, forwarded_signal): New functions. (sys_signal): Remove. All uses replaced by calls to sigaction and emacs_sigaction_init, or by direct calls to 'signal'. (sys_sigmask) [!__GNUC__]: Remove; no longer needed. (sys_sigblock, sys_sigunblock, sys_sigsetmask): Remove; all uses replaced by pthread_sigmask etc. calls. * src/syssignal.h: Include <signal.h>. (emacs_sigaction_init, forwarded_signal): New decls. (SIGMASKTYPE): Remove. All uses replaced by its definiens, sigset_t. (SIGEMPTYMASK): Remove; all uses replaced by its definiens, empty_mask. (sigmask, sys_sigmask): Remove; no longer needed. (sigpause): Remove. All uses replaced by its definiens, sigsuspend. (sigblock, sigunblock, sigfree): (sigsetmask) [!defined sigsetmask]: Remove. All uses replaced by pthread_sigmask. (signal): Remove. Its remaining uses (with SIG_DFL and SIG_IGN) no longer need to be replaced, and its typical old uses are now done via emacs_sigaction_init and sigaction. (sys_sigblock, sys_sigunblock, sys_sigsetmask): Remove decls. (sys_sigdel): Remove; unused. (NSIG): Remove a FIXME; the code's fine. Remove an unnecessary ifdef. Fixes: debbugs:12327
Diffstat (limited to 'src/xterm.c')
-rw-r--r--src/xterm.c22
1 files changed, 14 insertions, 8 deletions
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)
10759void 10762void
10760x_initialize (void) 10763x_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