This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]