From: Tom Tromey <tom@tromey.com>
To: gdb-patches@sourceware.org
Cc: Tom Tromey <tom@tromey.com>
Subject: [RFC 17/17] Simplify gdbserver's serial event handling
Date: Sun, 24 Feb 2019 16:52:00 -0000 [thread overview]
Message-ID: <20190224165153.5062-18-tom@tromey.com> (raw)
In-Reply-To: <20190224165153.5062-1-tom@tromey.com>
Currently, when gdbserver handles a serial event, it also calls
'reschedule' to install a timer that is then used to process any data
that remains after the previous packet was processed.
It seemed better to me to simply have the file descriptor callback
loop, processing packets until complete.
2019-02-24 Tom Tromey <tom@tromey.com>
* server.h (handle_serial_event): Update.
* server.c (handle_serial_event): Return int. Remove parameters.
* remote-utils.c (readchar_callback): Remove.
(handle_accept_event, remote_open): Use handle_all_serial_events.
(readchar): Don't call reschedule.
(reset_readchar): Update.
(process_remaining, reschedule): Remove.
(handle_all_serial_events): New function.
---
gdb/gdbserver/ChangeLog | 11 ++++++++
gdb/gdbserver/remote-utils.c | 53 +++++++++++++-----------------------
gdb/gdbserver/server.c | 10 +++----
gdb/gdbserver/server.h | 2 +-
4 files changed, 35 insertions(+), 41 deletions(-)
diff --git a/gdb/gdbserver/remote-utils.c b/gdb/gdbserver/remote-utils.c
index b1e4e869b69..7b41090efcc 100644
--- a/gdb/gdbserver/remote-utils.c
+++ b/gdb/gdbserver/remote-utils.c
@@ -83,13 +83,9 @@ enum {
NOT_SCHEDULED = -1
};
-/* Status of the readchar callback.
- Either NOT_SCHEDULED or the callback id. */
-static int readchar_callback = NOT_SCHEDULED;
-
static int readchar (void);
static void reset_readchar (void);
-static void reschedule (void);
+static void handle_all_serial_events (int err, gdb_client_data client_data);
/* A cache entry for a successfully looked-up symbol. */
struct sym_cache
@@ -204,7 +200,7 @@ handle_accept_event (int err, gdb_client_data client_data)
enable_async_notification (remote_desc);
/* Register the event loop handler. */
- add_file_handler (remote_desc, handle_serial_event, NULL);
+ add_file_handler (remote_desc, handle_all_serial_events, NULL);
/* We have a new GDB connection now. If we were disconnected
tracing, there's a window where the target could report a stop
@@ -341,7 +337,7 @@ remote_open (const char *name)
enable_async_notification (remote_desc);
/* Register the event loop handler. */
- add_file_handler (remote_desc, handle_serial_event, NULL);
+ add_file_handler (remote_desc, handle_all_serial_events, NULL);
}
#ifndef USE_WIN32API
else if (port_str == NULL)
@@ -382,7 +378,7 @@ remote_open (const char *name)
enable_async_notification (remote_desc);
/* Register the event loop handler. */
- add_file_handler (remote_desc, handle_serial_event, NULL);
+ add_file_handler (remote_desc, handle_all_serial_events, NULL);
}
#endif /* USE_WIN32API */
else
@@ -879,9 +875,9 @@ initialize_async_io (void)
#endif
}
-/* Internal buffer used by readchar.
- These are global to readchar because reschedule_remote needs to be
- able to tell whether the buffer is empty. */
+/* Internal buffer used by readchar. These are global to readchar
+ because handle_all_serial_events needs to be able to tell whether
+ the buffer is empty. */
static unsigned char readchar_buf[BUFSIZ];
static int readchar_bufcnt = 0;
@@ -916,7 +912,6 @@ readchar (void)
readchar_bufcnt--;
ch = *readchar_bufp++;
- reschedule ();
return ch;
}
@@ -926,33 +921,23 @@ static void
reset_readchar (void)
{
readchar_bufcnt = 0;
- if (readchar_callback != NOT_SCHEDULED)
- {
- delete_timer (readchar_callback);
- readchar_callback = NOT_SCHEDULED;
- }
}
-/* Process remaining data in readchar_buf. */
+/* Loop, calling handle_serial_event, until there is no more data
+ available. */
static void
-process_remaining (void *context)
+handle_all_serial_events (int err, gdb_client_data client_data)
{
- /* This is a one-shot event. */
- readchar_callback = NOT_SCHEDULED;
-
- if (readchar_bufcnt > 0)
- handle_serial_event (0, NULL);
-}
-
-/* If there is still data in the buffer, queue another event to process it,
- we can't sleep in select yet. */
-
-static void
-reschedule (void)
-{
- if (readchar_bufcnt > 0 && readchar_callback == NOT_SCHEDULED)
- readchar_callback = create_timer (0, process_remaining, NULL);
+ do
+ {
+ if (handle_serial_event () < 0)
+ {
+ stop_event_loop ();
+ break;
+ }
+ }
+ while (readchar_bufcnt > 0);
}
/* Read a packet from the remote machine, with error checking,
diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c
index 42147c1d836..3732d53cfbc 100644
--- a/gdb/gdbserver/server.c
+++ b/gdb/gdbserver/server.c
@@ -4389,22 +4389,20 @@ process_serial_event (void)
/* Event-loop callback for serial events. */
-void
-handle_serial_event (int err, gdb_client_data client_data)
+int
+handle_serial_event ()
{
if (debug_threads)
debug_printf ("handling possible serial event\n");
/* Really handle it. */
if (process_serial_event () < 0)
- {
- stop_event_loop ();
- return;
- }
+ return -1;
/* Be sure to not change the selected thread behind GDB's back.
Important in the non-stop mode asynchronous protocol. */
set_desired_thread ();
+ return 0;
}
/* Push a stop notification on the notification queue. */
diff --git a/gdb/gdbserver/server.h b/gdb/gdbserver/server.h
index e6a8dcc9bf1..9ffc9e0c958 100644
--- a/gdb/gdbserver/server.h
+++ b/gdb/gdbserver/server.h
@@ -83,7 +83,7 @@ extern int non_stop;
/* Functions from server.c. */
extern void handle_v_requests (char *own_buf, int packet_len,
int *new_packet_len);
-extern void handle_serial_event (int err, gdb_client_data client_data);
+extern int handle_serial_event ();
extern void handle_target_event (int err, gdb_client_data client_data);
/* Get rid of the currently pending stop replies that match PTID. */
--
2.17.2
next prev parent reply other threads:[~2019-02-24 16:52 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-02-24 16:51 [RFC 00/17] Merge event loop implementations Tom Tromey
2019-02-24 16:52 ` [RFC 07/17] Use warning in event-loop Tom Tromey
2019-09-26 14:02 ` Pedro Alves
2019-02-24 16:52 ` [RFC 08/17] Introduce and use flush_streams Tom Tromey
2019-02-24 16:52 ` [RFC 02/17] Move gdb-specific code out of start_event_loop Tom Tromey
2019-09-26 14:02 ` Pedro Alves
2019-02-24 16:52 ` [RFC 03/17] Move event-loop configury to common.m4 Tom Tromey
2019-02-24 16:52 ` [RFC 15/17] Move gdb_notifier comment Tom Tromey
2019-09-26 14:06 ` Pedro Alves
2019-02-24 16:52 ` [RFC 11/17] Implement event-loop glue for gdbserver Tom Tromey
2019-02-24 16:52 ` [RFC 16/17] Remove gdb_fildes_t Tom Tromey
2019-02-24 16:52 ` [RFC 12/17] Add the ability to stop the event loop Tom Tromey
2019-02-24 16:52 ` [RFC 01/17] Remove include from event-loop.c Tom Tromey
2019-02-24 16:52 ` [RFC 05/17] Remove gdb_usleep.c Tom Tromey
2019-09-26 14:02 ` Pedro Alves
2019-09-26 14:43 ` Tom Tromey
2019-02-24 16:52 ` [RFC 04/17] Move gdb_select.h to common/ Tom Tromey
2019-02-24 16:52 ` [RFC 06/17] Include <chrono> in event-loop.c Tom Tromey
2019-09-26 14:02 ` Pedro Alves
2019-02-24 16:52 ` [RFC 09/17] Introduce async-event.[ch] Tom Tromey
2019-09-26 14:06 ` Pedro Alves
2019-10-04 22:17 ` Tom Tromey
2019-02-24 16:52 ` [RFC 14/17] Remove some dead code from event-loop.c Tom Tromey
2019-02-24 16:52 ` Tom Tromey [this message]
2019-09-26 17:36 ` [RFC 17/17] Simplify gdbserver's serial event handling Pedro Alves
2019-10-04 22:08 ` Tom Tromey
2019-02-24 16:52 ` [RFC 13/17] Switch gdbserver to common event loop Tom Tromey
2019-02-24 16:52 ` [RFC 10/17] Move event-loop.[ch] to common/ Tom Tromey
2019-09-26 14:06 ` Pedro Alves
2019-10-04 22:06 ` Tom Tromey
2019-02-24 17:14 ` [RFC 00/17] Merge event loop implementations Eli Zaretskii
2019-02-24 17:26 ` Tom Tromey
2019-02-24 17:45 ` Eli Zaretskii
2019-02-25 19:57 ` Tom Tromey
2019-02-25 20:30 ` Eli Zaretskii
2019-02-25 20:55 ` Tom Tromey
2019-02-26 16:04 ` Eli Zaretskii
2019-02-26 16:23 ` Tom Tromey
2019-02-26 16:46 ` Eli Zaretskii
2019-09-26 17:47 ` Pedro Alves
2019-09-26 23:09 ` Tom Tromey
2019-09-27 13:53 ` Pedro Alves
2019-09-27 14:05 ` Pedro Alves
2019-09-27 14:21 ` Eli Zaretskii
2019-09-27 14:53 ` Pedro Alves
2019-09-27 15:32 ` Eli Zaretskii
2019-09-27 19:10 ` Tom Tromey
2020-02-14 2:22 ` Tom Tromey
2020-02-14 17:58 ` Pedro Alves
2020-02-14 18:36 ` Tom Tromey
2019-10-04 22:25 ` Tom Tromey
2020-02-14 18:20 ` Pedro Alves
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=20190224165153.5062-18-tom@tromey.com \
--to=tom@tromey.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