[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
emacs-28 e848880: Avoid aborts when a thread is signaled while "waiting
From: |
Eli Zaretskii |
Subject: |
emacs-28 e848880: Avoid aborts when a thread is signaled while "waiting for input". |
Date: |
Sat, 16 Oct 2021 07:49:36 -0400 (EDT) |
branch: emacs-28
commit e8488808dfe1460ce07042a1a523097ab90cf079
Author: Eli Zaretskii <eliz@gnu.org>
Commit: Eli Zaretskii <eliz@gnu.org>
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)
---
src/process.c | 22 +++++++++++++++++++---
1 file changed, 19 insertions(+), 3 deletions(-)
diff --git a/src/process.c b/src/process.c
index 746cdc0..6731f88 100644
--- a/src/process.c
+++ b/src/process.c
@@ -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);
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- emacs-28 e848880: Avoid aborts when a thread is signaled while "waiting for input".,
Eli Zaretskii <=