diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 6671148d8e..4e215bc9b4 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,6 +1,9 @@ -2006-03-09 Joel Brobecker +2006-03-09 Michael Snyder - * MAINTAINERS (Patch Champions): Remove self. + * linux-nat.c (kill_inferior): Just call target_mourn_inferior + instead of getting tricky for the multi-fork case. + * linux-fork.c (linux_fork_killall): Call PT_KILL and waitpid + for each fork, and then use init_fork_list to delete them. 2006-03-08 Alexandre Oliva diff --git a/gdb/linux-fork.c b/gdb/linux-fork.c index 768c7da595..f024490d1f 100644 --- a/gdb/linux-fork.c +++ b/gdb/linux-fork.c @@ -72,8 +72,7 @@ add_fork (pid_t pid) { struct fork_info *fp; - if (fork_list == NULL && - pid != PIDGET (inferior_ptid)) + if (fork_list == NULL && pid != PIDGET (inferior_ptid)) { /* Special case -- if this is the first fork in the list (the list is hitherto empty), and if this new fork is @@ -322,17 +321,22 @@ linux_fork_killall (void) status for it) -- however any process may be a child or a parent, so may get a SIGCHLD from a previously killed child. Wait them all out. */ + struct fork_info *fp; pid_t pid, ret; int status; - do { - pid = PIDGET (fork_list->ptid); - do { - ptrace (PT_KILL, pid, 0, 0); - ret = waitpid (pid, &status, 0); - } while (ret == pid && WIFSTOPPED (status)); - delete_fork (fork_list->ptid); - } while (fork_list != NULL); + for (fp = fork_list; fp; fp = fp->next) + { + pid = PIDGET (fp->ptid); + do { + ptrace (PT_KILL, pid, 0, 0); + ret = waitpid (pid, &status, 0); + /* We might get a SIGCHLD instead of an exit status. This is + aggravated by the first kill above - a child has just + died. MVS comment cut-and-pasted from linux-nat. */ + } while (ret == pid && WIFSTOPPED (status)); + } + init_fork_list (); /* Clear list, prepare to start fresh. */ } /* The current inferior_ptid has exited, but there are other viable diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c index 0710ac718a..2ba5d7d164 100644 --- a/gdb/linux-nat.c +++ b/gdb/linux-nat.c @@ -616,8 +616,6 @@ kill_inferior (void) if (forks_exist_p ()) { linux_fork_killall (); - pop_target (); - generic_mourn_inferior (); } else { @@ -646,8 +644,8 @@ kill_inferior (void) ptrace (PT_KILL, pid, 0, 0); ret = wait (&status); } - target_mourn_inferior (); } + target_mourn_inferior (); } /* On GNU/Linux there are no real LWP's. The closest thing to LWP's