aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Eggert2015-07-17 11:54:24 -0700
committerPaul Eggert2015-08-05 10:36:46 -0700
commita27ae9d7650a1230d4359eaf0a949f827315a6d2 (patch)
tree22b1733c43693ef2869a1408a7783efc35b6b16e
parenta5e6f33b4c8222ad62fdd7ff4bb0f8c5fac432c1 (diff)
downloademacs-24.tar.gz
emacs-24.zip
Fix hang with large yanksemacs-24
Backport of master commit 0592cefd03f1de2f04b721d07a16e6e0a9e48f73. 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.
-rw-r--r--src/dispextern.h1
-rw-r--r--src/emacs.c1
-rw-r--r--src/keyboard.c4
-rw-r--r--src/sysdep.c9
4 files changed, 2 insertions, 13 deletions
diff --git a/src/dispextern.h b/src/dispextern.h
index 239c4425646..cf3d1ecaf9c 100644
--- a/src/dispextern.h
+++ b/src/dispextern.h
@@ -3349,7 +3349,6 @@ void unrequest_sigio (void);
3349bool tabs_safe_p (int); 3349bool tabs_safe_p (int);
3350void init_baud_rate (int); 3350void init_baud_rate (int);
3351void init_sigio (int); 3351void init_sigio (int);
3352void ignore_sigio (void);
3353 3352
3354/* Defined in xfaces.c. */ 3353/* Defined in xfaces.c. */
3355 3354
diff --git a/src/emacs.c b/src/emacs.c
index 9b78a70428e..b5d3ab46a00 100644
--- a/src/emacs.c
+++ b/src/emacs.c
@@ -2028,7 +2028,6 @@ shut_down_emacs (int sig, Lisp_Object stuff)
2028 /* There is a tendency for a SIGIO signal to arrive within exit, 2028 /* There is a tendency for a SIGIO signal to arrive within exit,
2029 and cause a SIGHUP because the input descriptor is already closed. */ 2029 and cause a SIGHUP because the input descriptor is already closed. */
2030 unrequest_sigio (); 2030 unrequest_sigio ();
2031 ignore_sigio ();
2032 2031
2033 /* Do this only if terminating normally, we want glyph matrices 2032 /* Do this only if terminating normally, we want glyph matrices
2034 etc. in a core dump. */ 2033 etc. in a core dump. */
diff --git a/src/keyboard.c b/src/keyboard.c
index 945019e8418..77af44a7d46 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -3663,8 +3663,7 @@ kbd_buffer_store_event_hold (register struct input_event *event,
3663 /* Don't read keyboard input until we have processed kbd_buffer. 3663 /* Don't read keyboard input until we have processed kbd_buffer.
3664 This happens when pasting text longer than KBD_BUFFER_SIZE/2. */ 3664 This happens when pasting text longer than KBD_BUFFER_SIZE/2. */
3665 hold_keyboard_input (); 3665 hold_keyboard_input ();
3666 if (!noninteractive) 3666 unrequest_sigio ();
3667 ignore_sigio ();
3668 stop_polling (); 3667 stop_polling ();
3669 } 3668 }
3670#endif /* subprocesses */ 3669#endif /* subprocesses */
@@ -3829,6 +3828,7 @@ kbd_buffer_get_event (KBOARD **kbp,
3829 /* Start reading input again because we have processed enough to 3828 /* Start reading input again because we have processed enough to
3830 be able to accept new events again. */ 3829 be able to accept new events again. */
3831 unhold_keyboard_input (); 3830 unhold_keyboard_input ();
3831 request_sigio ();
3832 start_polling (); 3832 start_polling ();
3833 } 3833 }
3834#endif /* subprocesses */ 3834#endif /* subprocesses */
diff --git a/src/sysdep.c b/src/sysdep.c
index 01692c2d214..4b4801d58c9 100644
--- a/src/sysdep.c
+++ b/src/sysdep.c
@@ -649,15 +649,6 @@ unrequest_sigio (void)
649 interrupts_deferred = 1; 649 interrupts_deferred = 1;
650#endif 650#endif
651} 651}
652
653void
654ignore_sigio (void)
655{
656#ifdef USABLE_SIGIO
657 signal (SIGIO, SIG_IGN);
658#endif
659}
660
661 652
662/* Saving and restoring the process group of Emacs's terminal. */ 653/* Saving and restoring the process group of Emacs's terminal. */
663 654