This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[PATCH] Attach discard_pending_stop_replies to observer inferior_exit
- From: Yao Qi <yao at codesourcery dot com>
- To: <gdb-patches at sourceware dot org>
- Date: Fri, 7 Dec 2012 10:50:57 +0800
- Subject: [PATCH] Attach discard_pending_stop_replies to observer inferior_exit
Hi,
discard_pending_stop_replies is called in three places, remote_detach_1,
extended_remote_mourn_1 (/w param pid) and remote_close (/w param -1).
They will finally call observer_notify_inferior_exit in some way,
remote_detach_1 >remote_mourn_1 >generic_mourn_inferior >exit_inferior >observer_notify_inferior_exit
extended_remote_mourn_1 >generic_mourn_inferior >exit_inferior >observer_notify_inferior_exit
remote_close >discard_all_inferiors >exit_inferior_silent >observer_notify_inferior_exit
so this inspires me that we can attach discard_pending_stop_replies
to inferior_exit observer, and don't have to worry about the case that
PID is -1. This is what this patch does. Regression tested on
x86_64-linux with native and gdbserver. Is it OK?
gdb:
2012-12-07 Yao Qi <yao@codesourcery.com>
* remote.c (discard_pending_stop_replies): Remove declaration.
(remote_close): Remove call discard_pending_stop_replies.
(remote_detach_1, extended_remote_mourn_1): Likewise.
(discard_pending_stop_replies): Change parameter from PID to
INF.
(_initialize_remote): Attach discard_pending_stop_replies to
inferior_exit observer.
---
gdb/remote.c | 22 +++++++---------------
1 files changed, 7 insertions(+), 15 deletions(-)
diff --git a/gdb/remote.c b/gdb/remote.c
index 069f294..6d2f431 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -229,7 +229,6 @@ static void do_stop_reply_xfree (void *arg);
static void remote_parse_stop_reply (char *buf, struct stop_reply *);
static void push_stop_reply (struct stop_reply *);
static void remote_get_pending_stop_replies (void);
-static void discard_pending_stop_replies (int pid);
static int peek_stop_reply (ptid_t ptid);
static void remote_async_inferior_event_handler (gdb_client_data);
@@ -3022,9 +3021,6 @@ remote_close (int quitting)
inferior_ptid = null_ptid;
discard_all_inferiors ();
- /* We're no longer interested in any of these events. */
- discard_pending_stop_replies (-1);
-
if (remote_async_inferior_event_token)
delete_async_event_handler (&remote_async_inferior_event_token);
if (remote_async_get_pending_events_token)
@@ -4351,7 +4347,6 @@ remote_detach_1 (char *args, int from_tty, int extended)
if (from_tty && !extended)
puts_filtered (_("Ending remote debugging.\n"));
- discard_pending_stop_replies (pid);
target_mourn_inferior ();
}
@@ -5159,18 +5154,16 @@ stop_reply_xfree (struct stop_reply *r)
}
}
-/* Discard all pending stop replies of inferior PID. If PID is -1,
- discard everything. */
+/* Discard all pending stop replies of inferior INF. */
static void
-discard_pending_stop_replies (int pid)
+discard_pending_stop_replies (struct inferior *inf)
{
struct stop_reply *prev = NULL, *reply, *next;
/* Discard the in-flight notification. */
if (pending_stop_reply != NULL
- && (pid == -1
- || ptid_get_pid (pending_stop_reply->ptid) == pid))
+ && ptid_get_pid (pending_stop_reply->ptid) == inf->pid)
{
stop_reply_xfree (pending_stop_reply);
pending_stop_reply = NULL;
@@ -5181,8 +5174,7 @@ discard_pending_stop_replies (int pid)
for (reply = stop_reply_queue; reply; reply = next)
{
next = reply->next;
- if (pid == -1
- || ptid_get_pid (reply->ptid) == pid)
+ if (ptid_get_pid (reply->ptid) == inf->pid)
{
if (reply == stop_reply_queue)
stop_reply_queue = reply->next;
@@ -7656,9 +7648,6 @@ extended_remote_mourn_1 (struct target_ops *target)
connected. */
rs->waiting_for_stop_reply = 0;
- /* We're no longer interested in these events. */
- discard_pending_stop_replies (ptid_get_pid (inferior_ptid));
-
/* If the current general thread belonged to the process we just
detached from or has exited, the remote side current general
thread becomes undefined. Considering a case like this:
@@ -11335,6 +11324,9 @@ _initialize_remote (void)
/* Hook into new objfile notification. */
observer_attach_new_objfile (remote_new_objfile);
+ /* We're no longer interested in notification events of an inferior
+ when it exits. */
+ observer_attach_inferior_exit (discard_pending_stop_replies);
/* Set up signal handlers. */
sigint_remote_token =
--
1.7.7.6