2009-08-14 Pedro Alves <pedro@codesourcery.com>
authorPedro Alves <palves@redhat.com>
Fri, 14 Aug 2009 14:28:15 +0000 (14:28 +0000)
committerPedro Alves <palves@redhat.com>
Fri, 14 Aug 2009 14:28:15 +0000 (14:28 +0000)
gdb/
* top.c (any_thread_of): Delete.
(kill_or_detach): Use any_thread_of_process.
* top.c (print_inferior_quit_action): New.
(quit_confirm): Rewrite to print info about all inferiors.
* target.c (dispose_inferior): New.
(target_preopen): Use it.

2009-08-14  Pedro Alves  <pedro@codesourcery.com>

gdb/testsuite/
* gdb.threads/killed.exp, gdb.threads/manythreads.exp,
gdb.threads/staticthreads.exp: Adjust to "quit" output changes.

gdb/ChangeLog
gdb/target.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.threads/killed.exp
gdb/testsuite/gdb.threads/manythreads.exp
gdb/testsuite/gdb.threads/staticthreads.exp
gdb/top.c

index 2a42ffeb1806374ba09ef9fe391defbdfcdcec23..297f57f5671b0c37126a1cb723fd84b5f3393484 100644 (file)
@@ -1,3 +1,12 @@
+2009-08-14  Pedro Alves  <pedro@codesourcery.com>
+
+       * top.c (any_thread_of): Delete.
+       (kill_or_detach): Use any_thread_of_process.
+       * top.c (print_inferior_quit_action): New.
+       (quit_confirm): Rewrite to print info about all inferiors.
+       * target.c (dispose_inferior): New.
+       (target_preopen): Use it.
+
 2009-08-14  Pedro Alves  <pedro@codesourcery.com>
 
        * ui-file.h (ui_file_xstrdup): Mention that the length argument
index 6a6c48ed9eee0ebc5180d839c7937d29084771ec..7ee444fa1a739ead89d625e2f519e43fb640734e 100644 (file)
@@ -1904,6 +1904,29 @@ target_pre_inferior (int from_tty)
     }
 }
 
+/* Callback for iterate_over_inferiors.  Gets rid of the given
+   inferior.  */
+
+static int
+dispose_inferior (struct inferior *inf, void *args)
+{
+  struct thread_info *thread;
+
+  thread = any_thread_of_process (inf->pid);
+  if (thread)
+    {
+      switch_to_thread (thread->ptid);
+
+      /* Core inferiors actually should be detached, not killed.  */
+      if (target_has_execution)
+       target_kill ();
+      else
+       target_detach (NULL, 0);
+    }
+
+  return 0;
+}
+
 /* This is to be called by the open routine before it does
    anything.  */
 
@@ -1912,11 +1935,12 @@ target_preopen (int from_tty)
 {
   dont_repeat ();
 
-  if (target_has_execution)
+  if (have_inferiors ())
     {
       if (!from_tty
-          || query (_("A program is being debugged already.  Kill it? ")))
-       target_kill ();
+         || !have_live_inferiors ()
+         || query (_("A program is being debugged already.  Kill it? ")))
+       iterate_over_inferiors (dispose_inferior, NULL);
       else
        error (_("Program not killed."));
     }
index 0807d8299bdde7476c7670ec0c15a8da26cd62fb..b56dfc454d7843f17adede6ad4c3d9599a50577b 100644 (file)
@@ -1,3 +1,8 @@
+2009-08-14  Pedro Alves  <pedro@codesourcery.com>
+
+       * gdb.threads/killed.exp, gdb.threads/manythreads.exp,
+       gdb.threads/staticthreads.exp: Adjust to "quit" output changes.
+
 2009-08-13  Pedro Alves  <pedro@codesourcery.com>
 
        * gdb.base/default.exp: Adjust "set language test": it's now an
index 23f096cda553b7ff4d209adfdc507170509f7b77..3752a48db2d7837a38cfb9122501c6df7b905a48 100644 (file)
@@ -87,7 +87,7 @@ gdb_expect {
 # Try to quit.
 send_gdb "quit\n"
 gdb_expect {
-    -re "The program is running.  Quit anyway \\(and kill it\\)\\? \\(y or n\\) $" {
+    -re "Quit anyway\\? \\(y or n\\) $" {
         send_gdb "y\n"
         exp_continue
     }
index 5ded2c2bf4fe75aa65f50ef97d2a484e452d0943..27d0996021b2361d0a4dd139258cc07576878f04 100644 (file)
@@ -160,7 +160,7 @@ gdb_test_multiple "" "stop threads 2" {
 } 
 
 gdb_test_multiple "quit" "GDB exits after stopping multithreaded program" {
-    -re "The program is running.  Quit anyway \\(and kill it\\)\\? \\(y or n\\) $" {
+    -re "Quit anyway\\? \\(y or n\\) $" {
        send_gdb "y\n"
        exp_continue
     }
index 08000fd9a0cee6b42de1bccd234af727cd8664c9..fccb2e9cd861617c844c78272573ce08ebb7b372 100644 (file)
@@ -91,7 +91,7 @@ gdb_test_multiple "info threads" "$test" {
 
 set test "GDB exits with static thread program"
 gdb_test_multiple "quit" "$test" {
-    -re "The program is running.  Quit anyway \\(and kill it\\)\\? \\(y or n\\) $" {
+    -re "Quit anyway\\? \\(y or n\\) $" {
        send_gdb "y\n"
        exp_continue
     }
index de494189f18c16a44744f443b0d2008cf89b7897..cb51e08d69e8550ea20d0cb606a5137a55fe9761 100644 (file)
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -1161,54 +1161,12 @@ set_prompt (char *s)
 }
 \f
 
-/* If necessary, make the user confirm that we should quit.  Return
-   non-zero if we should quit, zero if we shouldn't.  */
-
-int
-quit_confirm (void)
-{
-  if (! ptid_equal (inferior_ptid, null_ptid) && target_has_execution)
-    {
-      char *s;
-      struct inferior *inf = current_inferior ();
-
-      /* This is something of a hack.  But there's no reliable way to
-         see if a GUI is running.  The `use_windows' variable doesn't
-         cut it.  */
-      if (deprecated_init_ui_hook)
-       s = _("A debugging session is active.\nDo you still want to close the debugger?");
-      else if (inf->attach_flag)
-       s = _("The program is running.  Quit anyway (and detach it)? ");
-      else
-       s = _("The program is running.  Quit anyway (and kill it)? ");
-
-      if (!query ("%s", s))
-       return 0;
-    }
-
-  return 1;
-}
-
 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
-any_thread_of (struct thread_info *thread, void *arg)
-{
-  int pid = * (int *)arg;
-
-  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.  */
 
@@ -1218,8 +1176,8 @@ 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)
+  thread = any_thread_of_process (inf->pid);
+  if (thread != NULL)
     {
       switch_to_thread (thread->ptid);
 
@@ -1236,6 +1194,67 @@ kill_or_detach (struct inferior *inf, void *args)
   return 0;
 }
 
+/* Callback for iterate_over_inferiors.  Prints info about what GDB
+   will do to each inferior on a "quit".  ARG points to a struct
+   ui_out where output is to be collected.  */
+
+static int
+print_inferior_quit_action (struct inferior *inf, void *arg)
+{
+  struct ui_file *stb = arg;
+
+  if (inf->attach_flag)
+    fprintf_filtered (stb,
+                     _("\tInferior %d [%s] will be detached.\n"), inf->num,
+                     target_pid_to_str (pid_to_ptid (inf->pid)));
+  else
+    fprintf_filtered (stb,
+                     _("\tInferior %d [%s] will be killed.\n"), inf->num,
+                     target_pid_to_str (pid_to_ptid (inf->pid)));
+
+  return 0;
+}
+
+/* If necessary, make the user confirm that we should quit.  Return
+   non-zero if we should quit, zero if we shouldn't.  */
+
+int
+quit_confirm (void)
+{
+  struct ui_file *stb;
+  struct cleanup *old_chain;
+  char *str;
+  int qr;
+
+  /* Don't even ask if we're only debugging a core file inferior.  */
+  if (!have_live_inferiors ())
+    return 1;
+
+  /* Build the query string as a single string.  */
+  stb = mem_fileopen ();
+  old_chain = make_cleanup_ui_file_delete (stb);
+
+  /* This is something of a hack.  But there's no reliable way to see
+     if a GUI is running.  The `use_windows' variable doesn't cut
+     it.  */
+  if (deprecated_init_ui_hook)
+    fprintf_filtered (stb, _("A debugging session is active.\n"
+                            "Do you still want to close the debugger?"));
+  else
+    {
+      fprintf_filtered (stb, _("A debugging session is active.\n\n"));
+      iterate_over_inferiors (print_inferior_quit_action, stb);
+      fprintf_filtered (stb, _("\nQuit anyway? "));
+    }
+
+  str = ui_file_xstrdup (stb, NULL);
+  make_cleanup (xfree, str);
+
+  qr = query ("%s", str);
+  do_cleanups (old_chain);
+  return qr;
+}
+
 /* Helper routine for quit_force that requires error handling.  */
 
 static int