* top.c (any_thread_of, kill_or_detach): New functions.
authorPedro Alves <palves@redhat.com>
Mon, 22 Sep 2008 15:24:51 +0000 (15:24 +0000)
committerPedro Alves <palves@redhat.com>
Mon, 22 Sep 2008 15:24:51 +0000 (15:24 +0000)
(quit_target): Iterate over all inferiors, killing or detaching
accordingly.

gdb/ChangeLog
gdb/top.c

index 55b0a6360f2834c9f7fdbcff179a694844bc3d5f..6fe342a86e0d9cfeee1dafc97592f5f102eea39e 100644 (file)
@@ -1,3 +1,9 @@
+2008-09-22  Pedro Alves  <pedro@codesourcery.com>
+
+       * top.c (any_thread_of, kill_or_detach): New functions.
+       (quit_target): Iterate over all inferiors, killing or detaching
+       accordingly.
+
 2008-09-22  Pedro Alves  <pedro@codesourcery.com>
 
        Remove the attach_flag global, and make it per-inferior.
index 76e8cb8e6a90fd90c07c693d4e9764b00c2d60ae..d0ba466582d88ba13111776faea82a7755f5751b 100644 (file)
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -1204,28 +1204,58 @@ quit_confirm (void)
   return 1;
 }
 
-/* Helper routine for quit_force that requires error handling.  */
-
 struct qt_args
 {
   char *args;
   int from_tty;
 };
 
+/* Callback for iterate_over_threads.  Finds any thread of inferior
+   given by ARG (really an int*).  */
+
 static int
-quit_target (void *arg)
+any_thread_of (struct thread_info *thread, void *arg)
 {
-  struct qt_args *qt = (struct qt_args *)arg;
+  int pid = * (int *)arg;
 
-  if (! ptid_equal (inferior_ptid, null_ptid) && target_has_execution)
+  if (PIDGET (thread->ptid) == pid)
+    return 1;
+
+  return 0;
+}
+
+/* Callback for iterate_over_inferiors.  Kills or detaches the given
+   inferior, depending on how we originally gained control of it.  */
+
+static int
+kill_or_detach (struct inferior *inf, void *args)
+{
+  struct qt_args *qt = args;
+  struct thread_info *thread;
+
+  thread = iterate_over_threads (any_thread_of, &inf->pid);
+  if (thread)
     {
-      struct inferior *inf = current_inferior ();
+      switch_to_thread (thread->ptid);
       if (inf->attach_flag)
-        target_detach (qt->args, qt->from_tty);
+       target_detach (qt->args, qt->from_tty);
       else
-        target_kill ();
+       target_kill ();
     }
 
+  return 0;
+}
+
+/* Helper routine for quit_force that requires error handling.  */
+
+static int
+quit_target (void *arg)
+{
+  struct qt_args *qt = (struct qt_args *)arg;
+
+  /* Kill or detach all inferiors.  */
+  iterate_over_inferiors (kill_or_detach, qt);
+
   /* Give all pushed targets a chance to do minimal cleanup, and pop
      them all out.  */
   pop_all_targets (1);