Avoid aborts when a thread is signaled while "waiting for input".

* src/process.c (kbd_is_ours): New function.
(wait_reading_process_output): Set 'waiting_for_input' only if the
current thread is monitoring the keyboard descriptor.  See also
https://lists.gnu.org/archive/html/emacs-devel/2021-10/msg01180.html.
(Bug#51229)
This commit is contained in:
Eli Zaretskii 2021-10-16 14:47:32 +03:00
parent 21397cce51
commit e8488808df

View file

@ -683,6 +683,22 @@ clear_waiting_thread_info (void)
}
}
/* Return TRUE if the keyboard descriptor is being monitored by the
current thread, FALSE otherwise. */
static bool
kbd_is_ours (void)
{
for (int fd = 0; fd <= max_desc; ++fd)
{
if (fd_callback_info[fd].waiting_thread != current_thread)
continue;
if ((fd_callback_info[fd].flags & (FOR_READ | KEYBOARD_FD))
== (FOR_READ | KEYBOARD_FD))
return true;
}
return false;
}
/* Compute the Lisp form of the process status, p->status, from
the numeric status that was returned by `wait'. */
@ -5312,13 +5328,13 @@ wait_reading_process_output (intmax_t time_limit, int nsecs, int read_kbd,
wait_reading_process_output_1 ();
}
/* Cause C-g and alarm signals to take immediate action,
/* Cause C-g signals to take immediate action,
and cause input available signals to zero out timeout.
It is important that we do this before checking for process
activity. If we get a SIGCHLD after the explicit checks for
process activity, timeout is the only way we will know. */
if (read_kbd < 0)
if (read_kbd < 0 && kbd_is_ours ())
set_waiting_for_input (&timeout);
/* If status of something has changed, and no input is
@ -5448,7 +5464,7 @@ wait_reading_process_output (intmax_t time_limit, int nsecs, int read_kbd,
{
clear_waiting_for_input ();
redisplay_preserve_echo_area (11);
if (read_kbd < 0)
if (read_kbd < 0 && kbd_is_ours ())
set_waiting_for_input (&timeout);
}