+2011-05-04  Doug Evans  <dje@google.com>
+
+       * linux-low.c (linux_join): Skip process lookup.
+       * spu-low.c (spu_join): Ditto.
+       * server.c (join_inferiors_callback): Delete.
+       (process_serial_event): For 'D' packet (detach) call join_inferior
+       directly.
+
 2011-05-04  Joseph Myers  <joseph@codesourcery.com>
 
        * README: Don't mention xscale*-*-linux*.
 
 linux_join (int pid)
 {
   int status, ret;
-  struct process_info *process;
-
-  process = find_process_pid (pid);
-  if (process == NULL)
-    return;
 
   do {
     ret = my_waitpid (pid, &status, 0);
 
   for_each_inferior (&all_processes, detach_or_kill_inferior_callback);
 }
 
-static void
-join_inferiors_callback (struct inferior_list_entry *entry)
-{
-  struct process_info *process = (struct process_info *) entry;
-
-  /* If we are attached, then we can exit.  Otherwise, we need to hang
-     around doing nothing, until the child is gone.  */
-  if (!process->attached)
-    join_inferior (ptid_get_pid (process->head.id));
-}
-
 int
 main (int argc, char *argv[])
 {
              /* If we are attached, then we can exit.  Otherwise, we
                 need to hang around doing nothing, until the child is
                 gone.  */
-             for_each_inferior (&all_processes,
-                                join_inferiors_callback);
+             join_inferior (pid);
              exit (0);
            }
        }
 
 spu_join (int pid)
 {
   int status, ret;
-  struct process_info *process;
-
-  process = find_process_pid (pid);
-  if (process == NULL)
-    return;
 
   do {
     ret = waitpid (pid, &status, 0);