From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 27883 invoked by alias); 14 Dec 2012 13:30:46 -0000 Received: (qmail 27866 invoked by uid 22791); 14 Dec 2012 13:30:45 -0000 X-SWARE-Spam-Status: No, hits=-4.5 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,KHOP_THREADED,RCVD_IN_HOSTKARMA_W,RCVD_IN_HOSTKARMA_WL,TW_BJ X-Spam-Check-By: sourceware.org Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 14 Dec 2012 13:30:38 +0000 Received: from svr-orw-exc-10.mgc.mentorg.com ([147.34.98.58]) by relay1.mentorg.com with esmtp id 1TjVLZ-0004ea-2h from Yao_Qi@mentor.com ; Fri, 14 Dec 2012 05:30:37 -0800 Received: from SVR-ORW-FEM-02.mgc.mentorg.com ([147.34.96.206]) by SVR-ORW-EXC-10.mgc.mentorg.com with Microsoft SMTPSVC(6.0.3790.4675); Fri, 14 Dec 2012 05:30:36 -0800 Received: from qiyao.dyndns.org (147.34.91.1) by svr-orw-fem-02.mgc.mentorg.com (147.34.96.168) with Microsoft SMTP Server id 14.1.289.1; Fri, 14 Dec 2012 05:30:34 -0800 Message-ID: <50CB29D2.4000205@codesourcery.com> Date: Fri, 14 Dec 2012 13:30:00 -0000 From: Yao Qi User-Agent: Mozilla/5.0 (X11; Linux i686; rv:15.0) Gecko/20120911 Thunderbird/15.0.1 MIME-Version: 1.0 To: Pedro Alves CC: Subject: Re: [PATCH] Attach discard_pending_stop_replies to observer inferior_exit References: <1354848657-10348-1-git-send-email-yao@codesourcery.com> <50CAF720.9040704@redhat.com> In-Reply-To: <50CAF720.9040704@redhat.com> Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8bit X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2012-12/txt/msg00494.txt.bz2 On 12/14/2012 05:53 PM, Pedro Alves wrote: > GDB can be learning about new processes it didn't know about yet > from some yet-unprocessed stop reply. So if we only clear stop replies > specific to each inferior, we'd leave those behind. But, we're closing > the remote target here. We really want to discard everything. I see, then I change 'discard_pending_stop_replies' a little that INF is NULL means discard everything. This patch is tested on x86_64-linux with native and gdbserver. OK? -- Yao (齐尧) gdb: 2012-12-14 Yao Qi * remote.c (discard_pending_stop_replies): Update declaration. (remote_detach_1, extended_remote_mourn_1): Likewise. (discard_pending_stop_replies): Change parameter from PID to INF. (remote_close): Update caller. (_initialize_remote): Attach discard_pending_stop_replies to inferior_exit observer. --- gdb/remote.c | 28 +++++++++++++++------------- 1 files changed, 15 insertions(+), 13 deletions(-) diff --git a/gdb/remote.c b/gdb/remote.c index 069f294..673938d 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -229,7 +229,7 @@ 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 void discard_pending_stop_replies (struct inferior *); static int peek_stop_reply (ptid_t ptid); static void remote_async_inferior_event_handler (gdb_client_data); @@ -3022,8 +3022,11 @@ 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); + /* Stop replies may from inferiors which are still unknown to GDB. + We are closing the remote target, so we should discard + everything, including the stop replies from GDB-unknown + inferiors. */ + discard_pending_stop_replies (NULL); if (remote_async_inferior_event_token) delete_async_event_handler (&remote_async_inferior_event_token); @@ -4351,7 +4354,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 +5161,18 @@ stop_reply_xfree (struct stop_reply *r) } } -/* Discard all pending stop replies of inferior PID. If PID is -1, +/* Discard all pending stop replies of inferior INF. If INF is NULL, discard everything. */ 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)) + && (inf == NULL + || ptid_get_pid (pending_stop_reply->ptid) == inf->pid)) { stop_reply_xfree (pending_stop_reply); pending_stop_reply = NULL; @@ -5181,8 +5183,8 @@ 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 (inf == NULL + || ptid_get_pid (reply->ptid) == inf->pid) { if (reply == stop_reply_queue) stop_reply_queue = reply->next; @@ -7656,9 +7658,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 +11334,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