From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 14169 invoked by alias); 10 Dec 2008 21:45:30 -0000 Received: (qmail 14153 invoked by uid 22791); 10 Dec 2008 21:45:29 -0000 X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (65.74.133.4) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 10 Dec 2008 21:44:53 +0000 Received: (qmail 13714 invoked from network); 10 Dec 2008 21:44:51 -0000 Received: from unknown (HELO orlando.local) (pedro@127.0.0.2) by mail.codesourcery.com with ESMTPA; 10 Dec 2008 21:44:51 -0000 From: Pedro Alves To: gdb-patches@sourceware.org Subject: Re: mourn the correct dead inferior Date: Wed, 10 Dec 2008 21:45:00 -0000 User-Agent: KMail/1.9.10 Cc: Ulrich Weigand , Mark Kettenis References: <200812072016.09965.pedro@codesourcery.com> In-Reply-To: <200812072016.09965.pedro@codesourcery.com> MIME-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_YhDQJLKwMRcvzs3" Message-Id: <200812102144.56138.pedro@codesourcery.com> 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: 2008-12/txt/msg00192.txt.bz2 --Boundary-00=_YhDQJLKwMRcvzs3 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline Content-length: 2305 Hi guys, Can I take it that there are no objections to the target side bits? Mark, adding you to CC in case you want to comment on the inf-ptrace bit? I'd like to check this in so I can move on with some other remote.c cleanups dependent on this. I'll do any extra fixing if it turns out necessary. On Sunday 07 December 2008 20:16:09, Pedro Alves wrote: > Here's a piece I mentioned a bit earlier today. In multi-process, > we may be calling target_mourn_inferior on the wrong inferior, if the > inferior that exited happens to *not* be the current inferior the > user has selected. The obvious fix is to switch inferior_ptid > to the ecs->ptid. > > But, there are a few targets that return invalid ptids > on a TARGET_WAITKIND_EXIT or TARGET_WAITKIND_SIGNALLED. Even if > they don't support multi-process, that means that later on, > when target_mourn_inferior->generic_mourn_inferior is called, > we would leave the dead inferior still listed (and if we have breakpoint > locations per-inferior, as in the multiprocess branch, we will delete > the breakpoint locations of the wrong inferior). > > The linux-thread-db.c has no good reason to be filtering the ptid > the beneath target returns, so that's easy to fix, just return > that the beneath layer returned. > > The other targets I'm adjusting, are doing this: > > if (pid == -1) > { > warning (_("Child process unexpectedly missing: %s"), > safe_strerror (save_errno)); > > /* Claim it exited with unknown signal. */ > ourstatus->kind = TARGET_WAITKIND_SIGNALLED; > ourstatus->value.sig = TARGET_SIGNAL_UNKNOWN; > return minus_one_ptid; > } > > I'm not 100% sure what this catches, and, if this can really happen. > A 'kill -9' perhaps? I've changed them to return inferior_ptid > instead, which should still be OK, unless their target_mourn_inferior > implementation could hang in that case --- I think not though. If we find > that this is a problem, then we'll need a new TARGET_WAITKIND_DISAPPEARED > and perhaps a corresponding new target_ops method to handle it (or > just call generic_mourn_inferior) ... > > Comments? > > (I think that with further cleanups, we'll be switching > inferior_ptid unconditionaly to the event ptid in all-stop as well...) > -- Pedro Alves --Boundary-00=_YhDQJLKwMRcvzs3 Content-Type: text/x-diff; charset="iso 8859-15"; name="mourn_dead_inferior.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="mourn_dead_inferior.diff" Content-length: 3899 2008-12-07 Pedro Alves (handle_inferior_event): On a TARGET_WAITKIND_EXITED or TARGET_WAITKIND_SIGNALLED, switch inferior_ptid to the event ptid. * linux_thread_db.c (thread_db_wait): On a TARGET_WAITKIND_EXITED or TARGET_WAITKIND_SIGNALLED, return the ptid the beneath target returned. * inf-ptrace.c (inf_ptrace_wait): Return inferior_ptid instead of minus_one_ptid if the inferior disappeared. * rs6000-nat.c (rs6000_wait): Likewise. * spu-linux-nat.c (spu_child_wait): Likewise. --- gdb/inf-ptrace.c | 2 +- gdb/infrun.c | 2 ++ gdb/linux-thread-db.c | 4 ++-- gdb/rs6000-nat.c | 2 +- gdb/spu-linux-nat.c | 2 +- 5 files changed, 7 insertions(+), 5 deletions(-) Index: src/gdb/infrun.c =================================================================== --- src.orig/gdb/infrun.c 2008-12-07 20:26:06.000000000 +0000 +++ src/gdb/infrun.c 2008-12-07 20:26:07.000000000 +0000 @@ -2271,6 +2271,7 @@ handle_inferior_event (struct execution_ case TARGET_WAITKIND_EXITED: if (debug_infrun) fprintf_unfiltered (gdb_stdlog, "infrun: TARGET_WAITKIND_EXITED\n"); + inferior_ptid = ecs->ptid; target_terminal_ours (); /* Must do this before mourn anyway */ print_stop_reason (EXITED, ecs->ws.value.integer); @@ -2289,6 +2290,7 @@ handle_inferior_event (struct execution_ case TARGET_WAITKIND_SIGNALLED: if (debug_infrun) fprintf_unfiltered (gdb_stdlog, "infrun: TARGET_WAITKIND_SIGNALLED\n"); + inferior_ptid = ecs->ptid; stop_print_frame = 0; target_terminal_ours (); /* Must do this before mourn anyway */ Index: src/gdb/linux-thread-db.c =================================================================== --- src.orig/gdb/linux-thread-db.c 2008-12-07 20:26:06.000000000 +0000 +++ src/gdb/linux-thread-db.c 2008-12-07 20:26:39.000000000 +0000 @@ -888,8 +888,8 @@ thread_db_wait (ptid_t ptid, struct targ return ptid; if (ourstatus->kind == TARGET_WAITKIND_EXITED - || ourstatus->kind == TARGET_WAITKIND_SIGNALLED) - return pid_to_ptid (-1); + || ourstatus->kind == TARGET_WAITKIND_SIGNALLED) + return ptid; if (ourstatus->kind == TARGET_WAITKIND_EXECD) { Index: src/gdb/inf-ptrace.c =================================================================== --- src.orig/gdb/inf-ptrace.c 2008-12-07 20:26:06.000000000 +0000 +++ src/gdb/inf-ptrace.c 2008-12-07 20:26:07.000000000 +0000 @@ -410,7 +410,7 @@ inf_ptrace_wait (ptid_t ptid, struct tar /* Claim it exited with unknown signal. */ ourstatus->kind = TARGET_WAITKIND_SIGNALLED; ourstatus->value.sig = TARGET_SIGNAL_UNKNOWN; - return minus_one_ptid; + return inferior_ptid; } /* Ignore terminated detached child processes. */ Index: src/gdb/rs6000-nat.c =================================================================== --- src.orig/gdb/rs6000-nat.c 2008-12-07 20:26:06.000000000 +0000 +++ src/gdb/rs6000-nat.c 2008-12-07 20:26:07.000000000 +0000 @@ -546,7 +546,7 @@ rs6000_wait (ptid_t ptid, struct target_ /* Claim it exited with unknown signal. */ ourstatus->kind = TARGET_WAITKIND_SIGNALLED; ourstatus->value.sig = TARGET_SIGNAL_UNKNOWN; - return minus_one_ptid; + return inferior_ptid; } /* Ignore terminated detached child processes. */ Index: src/gdb/spu-linux-nat.c =================================================================== --- src.orig/gdb/spu-linux-nat.c 2008-12-07 20:26:06.000000000 +0000 +++ src/gdb/spu-linux-nat.c 2008-12-07 20:26:07.000000000 +0000 @@ -444,7 +444,7 @@ spu_child_wait (ptid_t ptid, struct targ /* Claim it exited with unknown signal. */ ourstatus->kind = TARGET_WAITKIND_SIGNALLED; ourstatus->value.sig = TARGET_SIGNAL_UNKNOWN; - return minus_one_ptid; + return inferior_ptid; } store_waitstatus (ourstatus, status); --Boundary-00=_YhDQJLKwMRcvzs3--