>From d47c5b810123c6cbd14dd38ac461aa01a4eabacf Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Fri, 17 Jul 2015 11:54:24 -0700 Subject: [PATCH] Fix hang with large yanks Backport of emacs-25 0592cefd03f1de2f04b721d07a16e6e0a9e48f73. Upstream comment follows: Fix hang with large yanks This should fix the bug fixed by Mike Crowe's patch in: https://lists.gnu.org/archive/html/emacs-devel/2015-07/msg00106.html A problem in this area has been reported by several users; see Bug#16737, Bug#17101, Bug#17026, Bug#17172, Bug#19320, Bug#20283. This fix differs from Mike Crowe's patch in that it should avoid a race condition that could lose SIGIO signals. ignore_sigio dates back to the 1980s when some platforms couldn't block signals, and could only ignore them, which led to races when signals arrived while being ignored. We shouldn't have to worry about those old platforms now. * src/dispextern.h, src/sysdep.c (ignore_sigio): Remove. * src/emacs.c (shut_down_emacs): Don't call ignore_sigio; unrequest_sigio should suffice. * src/keyboard.c (kbd_buffer_store_buffered_event): Use unrequest_sigio, not ignore_sigio. (kbd_buffer_get_event): Call request_sigio when getting the ball rolling again. Conflicts: src/sysdep.c --- src/dispextern.h | 1 - src/emacs.c | 1 - src/keyboard.c | 4 ++-- src/sysdep.c | 9 --------- 4 files changed, 2 insertions(+), 13 deletions(-) diff --git a/src/dispextern.h b/src/dispextern.h index 239c442..cf3d1ec 100644 --- a/src/dispextern.h +++ b/src/dispextern.h @@ -3349,7 +3349,6 @@ void unrequest_sigio (void); bool tabs_safe_p (int); void init_baud_rate (int); void init_sigio (int); -void ignore_sigio (void); /* Defined in xfaces.c. */ diff --git a/src/emacs.c b/src/emacs.c index 9b78a70..b5d3ab4 100644 --- a/src/emacs.c +++ b/src/emacs.c @@ -2028,7 +2028,6 @@ shut_down_emacs (int sig, Lisp_Object stuff) /* There is a tendency for a SIGIO signal to arrive within exit, and cause a SIGHUP because the input descriptor is already closed. */ unrequest_sigio (); - ignore_sigio (); /* Do this only if terminating normally, we want glyph matrices etc. in a core dump. */ diff --git a/src/keyboard.c b/src/keyboard.c index 945019e..77af44a 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -3663,8 +3663,7 @@ kbd_buffer_store_event_hold (register struct input_event *event, /* Don't read keyboard input until we have processed kbd_buffer. This happens when pasting text longer than KBD_BUFFER_SIZE/2. */ hold_keyboard_input (); - if (!noninteractive) - ignore_sigio (); + unrequest_sigio (); stop_polling (); } #endif /* subprocesses */ @@ -3829,6 +3828,7 @@ kbd_buffer_get_event (KBOARD **kbp, /* Start reading input again because we have processed enough to be able to accept new events again. */ unhold_keyboard_input (); + request_sigio (); start_polling (); } #endif /* subprocesses */ diff --git a/src/sysdep.c b/src/sysdep.c index 01692c2..4b4801d 100644 --- a/src/sysdep.c +++ b/src/sysdep.c @@ -649,15 +649,6 @@ unrequest_sigio (void) interrupts_deferred = 1; #endif } - -void -ignore_sigio (void) -{ -#ifdef USABLE_SIGIO - signal (SIGIO, SIG_IGN); -#endif -} - /* Saving and restoring the process group of Emacs's terminal. */ -- 2.1.4