2006-03-09 Michael Snyder * 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. Index: linux-nat.c =================================================================== RCS file: /cvs/src/src/gdb/linux-nat.c,v retrieving revision 1.38 diff -p -r1.38 linux-nat.c *** linux-nat.c 20 Feb 2006 17:01:28 -0000 1.38 --- linux-nat.c 10 Mar 2006 00:57:30 -0000 *************** kill_inferior (void) *** 616,623 **** if (forks_exist_p ()) { linux_fork_killall (); - pop_target (); - generic_mourn_inferior (); } else { --- 616,621 ---- *************** kill_inferior (void) *** 646,653 **** ptrace (PT_KILL, pid, 0, 0); ret = wait (&status); } - target_mourn_inferior (); } } /* On GNU/Linux there are no real LWP's. The closest thing to LWP's --- 644,651 ---- ptrace (PT_KILL, pid, 0, 0); ret = wait (&status); } } + target_mourn_inferior (); } /* On GNU/Linux there are no real LWP's. The closest thing to LWP's Index: linux-fork.c =================================================================== RCS file: /cvs/src/src/gdb/linux-fork.c,v retrieving revision 1.3 diff -p -r1.3 linux-fork.c *** linux-fork.c 15 Jan 2006 19:07:17 -0000 1.3 --- linux-fork.c 10 Mar 2006 00:57:30 -0000 *************** add_fork (pid_t pid) *** 72,79 **** { struct fork_info *fp; ! 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 --- 72,78 ---- { struct fork_info *fp; ! 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 *************** linux_fork_killall (void) *** 322,338 **** 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. */ 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); } /* The current inferior_ptid has exited, but there are other viable --- 321,342 ---- 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; ! 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