From: Yao Qi <qiyaoltc@gmail.com>
To: gdb-patches@sourceware.org
Subject: [PATCH 2/2] [GDBserver] Block and unblock SIGIO
Date: Tue, 26 Jan 2016 09:59:00 -0000 [thread overview]
Message-ID: <1453802339-20401-3-git-send-email-yao.qi@linaro.org> (raw)
In-Reply-To: <1453802339-20401-1-git-send-email-yao.qi@linaro.org>
Nowadays, GDBserver disables async io (by ignoring SIGIO) when process
a serial event, and enables async io (by installing signal handler) when
resume the inferior and wait. GDBserver may miss SIGIO (by interrupt)
and doesn't process SIGIO in time, which is shown by
gdb.base/interrupt-noterm.exp. In the test, GDB sends "continue &" and
then "interrupt". if '\003' arrives at a period between GDBserver
receives vCont;c and enables async io, SIGIO is ignored because signal
handler isn't installed. GDBserver waits for the inferior and can not
notice '\003' until it returns from wait.
This patch changes the code to install SIGIO handler early, but block
and unblock SIGIO as needed. In this way, we don't remove SIGIO
handler, so SIGIO can't be ignored. However, GDBserver needs to
remove the signal handler when connection is closed.
gdb/gdbserver:
2016-01-26 Yao Qi <yao.qi@linaro.org>
* remote-utils.c (remote_close) [!USE_WIN32API]: Ignore SIGIO.
(unblock_async_io): Remove.
(enable_async_io): Don't install SIGIO handler. Unblock it
instead.
(disable_async_io): Don't ignore SIGIO. Block it instead.
(initialize_async_io): Install SIGIO handler. Don't call
unblock_async_io.
---
gdb/gdbserver/remote-utils.c | 51 ++++++++++++++++++++++++++------------------
1 file changed, 30 insertions(+), 21 deletions(-)
diff --git a/gdb/gdbserver/remote-utils.c b/gdb/gdbserver/remote-utils.c
index 000457d..541675a 100644
--- a/gdb/gdbserver/remote-utils.c
+++ b/gdb/gdbserver/remote-utils.c
@@ -402,6 +402,11 @@ remote_close (void)
{
delete_file_handler (remote_desc);
+#ifndef USE_WIN32API
+ /* Remove SIGIO handler. */
+ signal (SIGIO, SIG_IGN);
+#endif
+
#ifdef USE_WIN32API
closesocket (remote_desc);
#else
@@ -775,21 +780,9 @@ check_remote_input_interrupt_request (void)
input_interrupt (0);
}
-/* Asynchronous I/O support. SIGIO must be enabled when waiting, in order to
- accept Control-C from the client, and must be disabled when talking to
- the client. */
-
-static void
-unblock_async_io (void)
-{
-#ifndef USE_WIN32API
- sigset_t sigio_set;
-
- sigemptyset (&sigio_set);
- sigaddset (&sigio_set, SIGIO);
- sigprocmask (SIG_UNBLOCK, &sigio_set, NULL);
-#endif
-}
+/* Asynchronous I/O support. SIGIO must be unblocked when waiting,
+ in order to accept Control-C from the client, and must be blocked
+ when talking to the client. */
#ifdef __QNX__
static void
@@ -820,12 +813,19 @@ static int async_io_enabled;
void
enable_async_io (void)
{
+#ifndef USE_WIN32API
+ sigset_t sigio_set;
+#endif
+
if (async_io_enabled)
return;
#ifndef USE_WIN32API
- signal (SIGIO, input_interrupt);
+ sigemptyset (&sigio_set);
+ sigaddset (&sigio_set, SIGIO);
+ sigprocmask (SIG_UNBLOCK, &sigio_set, NULL);
#endif
+
async_io_enabled = 1;
#ifdef __QNX__
nto_comctrl (1);
@@ -836,12 +836,19 @@ enable_async_io (void)
void
disable_async_io (void)
{
+#ifndef USE_WIN32API
+ sigset_t sigio_set;
+#endif
+
if (!async_io_enabled)
return;
#ifndef USE_WIN32API
- signal (SIGIO, SIG_IGN);
+ sigemptyset (&sigio_set);
+ sigaddset (&sigio_set, SIGIO);
+ sigprocmask (SIG_BLOCK, &sigio_set, NULL);
#endif
+
async_io_enabled = 0;
#ifdef __QNX__
nto_comctrl (0);
@@ -852,12 +859,14 @@ disable_async_io (void)
void
initialize_async_io (void)
{
- /* Make sure that async I/O starts disabled. */
+ /* Install the signal handler. */
+#ifndef USE_WIN32API
+ signal (SIGIO, input_interrupt);
+#endif
+
+ /* Make sure that async I/O starts blocked. */
async_io_enabled = 1;
disable_async_io ();
-
- /* Make sure the signal is unblocked. */
- unblock_async_io ();
}
/* Internal buffer used by readchar.
--
1.9.1
next prev parent reply other threads:[~2016-01-26 9:59 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-01-22 16:29 [PATCH] Fix fail in gdb.base/interrupt-noterm.exp Yao Qi
2016-01-22 16:47 ` Pedro Alves
2016-01-22 17:14 ` Yao Qi
2016-01-22 17:35 ` Pedro Alves
2016-01-22 18:30 ` Pedro Alves
2016-01-25 9:30 ` Yao Qi
2016-01-25 10:43 ` Pedro Alves
2016-01-26 9:59 ` [PATCH 0/2 V2] Fix a " Yao Qi
2016-01-26 9:59 ` Yao Qi [this message]
2016-01-26 12:01 ` [PATCH 2/2] [GDBserver] Block and unblock SIGIO Pedro Alves
2016-01-26 13:55 ` Yao Qi
2016-01-26 9:59 ` [PATCH 1/2] [GDBserver] Check input interrupt after reading in a packet Yao Qi
2016-01-26 11:42 ` Pedro Alves
2016-01-26 13:53 ` Yao Qi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1453802339-20401-3-git-send-email-yao.qi@linaro.org \
--to=qiyaoltc@gmail.com \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).