2011-02-25 Michael Snyder <msnyder@vmware.com>
authorMichael Snyder <msnyder@vmware.com>
Sun, 27 Feb 2011 20:49:27 +0000 (20:49 +0000)
committerMichael Snyder <msnyder@vmware.com>
Sun, 27 Feb 2011 20:49:27 +0000 (20:49 +0000)
* inferior.c (detach_inferior_command): Use get_number_or_range.
(kill_inferior_command): Ditto.
(remove_inferior_command): Ditto.
(initialize_inferiors): Make command names plural.
Update help strings.

2011-02-25  Michael Snyder  <msnyder@vmware.com>

* gdb.texinfo (Inferiors and Programs): Update commands to show
that they can accept multiple arguments.

2011-02-25  Michael Snyder  <msnyder@vmware.com>

* gdb.multi/base.exp: Add test for remove-inferiors.

gdb/ChangeLog
gdb/doc/ChangeLog
gdb/doc/gdb.texinfo
gdb/inferior.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.multi/base.exp

index 51311e7239dfc26a551fb52267596632ec08e7a7..f8ccb3331f86c6572231f9a3801f1dd35cd5af21 100644 (file)
        * python/py-value.c: Ditto.
        * tui/tui-win.c: Ditto.
 
+2011-02-25  Michael Snyder  <msnyder@vmware.com>
+
+       * inferior.c (detach_inferior_command): Use get_number_or_range.
+       (kill_inferior_command): Ditto.
+       (remove_inferior_command): Ditto.
+       (initialize_inferiors): Make command names plural.
+       Update help strings.
+
 2011-02-25  Michael Snyder  <msnyder@vmware.com>
 
        * inferior.c (print_inferior): Accept a string instead of an int
index 59cf1e46abba2b0437de61b7fea1bb8dc6b17ce1..e84de14a11dcc73b480ebf323dd0f5d51a97889d 100644 (file)
@@ -1,3 +1,8 @@
+2011-02-25  Michael Snyder  <msnyder@vmware.com>
+
+       * gdb.texinfo (Inferiors and Programs): Update commands to show 
+       that they can accept multiple arguments.
+
 2011-02-24  Joel Brobecker  <brobecker@adacore.com>
 
        Revert the following patch (code patch was not approved):
index c727dc89effbe190adc155e1765da7d222081e34..fc704efa9577f00481182c5ae7f30bb5c383ebf3 100644 (file)
@@ -2465,7 +2465,7 @@ You can get multiple executables into a debugging session via the
 systems @value{GDBN} can add inferiors to the debug session
 automatically by following calls to @code{fork} and @code{exec}.  To
 remove inferiors from the debugging session use the
-@w{@code{remove-inferior}} command.
+@w{@code{remove-inferiors}} command.
 
 @table @code
 @kindex add-inferior
@@ -2498,37 +2498,37 @@ Added inferior 2.
 
 You can now simply switch focus to inferior 2 and run it.
 
-@kindex remove-inferior
-@item remove-inferior @var{infno}
-Removes the inferior @var{infno}.  It is not possible to remove an
-inferior that is running with this command.  For those, use the
-@code{kill} or @code{detach} command first.
+@kindex remove-inferiors
+@item remove-inferiors @var{infno}@dots{}
+Removes the inferior or inferiors @var{infno}@dots{}.  It is not
+possible to remove an inferior that is running with this command.  For
+those, use the @code{kill} or @code{detach} command first.
 
 @end table
 
 To quit debugging one of the running inferiors that is not the current
 inferior, you can either detach from it by using the @w{@code{detach
 inferior}} command (allowing it to run independently), or kill it
-using the @w{@code{kill inferior}} command:
+using the @w{@code{kill inferiors}} command:
 
 @table @code
-@kindex detach inferior @var{infno}
-@item detach inferior @var{infno}
-Detach from the inferior identified by @value{GDBN} inferior number
-@var{infno}.  Note that the inferior's entry still stays on the list
-of inferiors shown by @code{info inferiors}, but its Description will
-show @samp{<null>}.
+@kindex detach inferiors @var{infno}@dots{}
+@item detach inferior @var{infno}@dots{}
+Detach from the inferior or inferiors identified by @value{GDBN}
+inferior number(s) @var{infno}@dots.  Note that the inferior's entry
+still stays on the list of inferiors shown by @code{info inferiors},
+but its Description will show @samp{<null>}.
 
-@kindex kill inferior @var{infno}
-@item kill inferior @var{infno}
-Kill the inferior identified by @value{GDBN} inferior number
-@var{infno}.  Note that the inferior's entry still stays on the list
-of inferiors shown by @code{info inferiors}, but its Description will
-show @samp{<null>}.
+@kindex kill inferiors @var{infno}@dots{}
+@item kill inferiors @var{infno}@dots{}
+Kill the inferior or inferiors identified by @value{GDBN} inferior
+number(s) @var{infno}@dots{}.  Note that the inferior's entry still
+stays on the list of inferiors shown by @code{info inferiors}, but its
+Description will show @samp{<null>}.
 @end table
 
 After the successful completion of a command such as @code{detach},
-@code{detach inferior}, @code{kill} or @code{kill inferior}, or after
+@code{detach inferiors}, @code{kill} or @code{kill inferiors}, or after
 a normal process exit, the inferior is still valid and listed with
 @code{info inferiors}, ready to be restarted.
 
@@ -2986,8 +2986,8 @@ to another by using the @code{inferior} command (@pxref{Inferiors and
 Programs, ,Debugging Multiple Inferiors and Programs}).
 
 To quit debugging one of the forked processes, you can either detach
-from it by using the @w{@code{detach inferior}} command (allowing it
-to run independently), or kill it using the @w{@code{kill inferior}}
+from it by using the @w{@code{detach inferiors}} command (allowing it
+to run independently), or kill it using the @w{@code{kill inferiors}}
 command.  @xref{Inferiors and Programs, ,Debugging Multiple Inferiors
 and Programs}.
 
index ebe13bf51310fcf293b45b343e6074bbfce4c600..76f81c36b0f2a2240d041c777918dda7fabd2431 100644 (file)
@@ -624,22 +624,31 @@ detach_inferior_command (char *args, int from_tty)
   struct thread_info *tp;
 
   if (!args || !*args)
-    error (_("Requires argument (inferior id to detach)"));
+    error (_("Requires argument (inferior id(s) to detach)"));
 
-  num = parse_and_eval_long (args);
+  while (*args != '\0')
+    {
+      num = get_number_or_range (&args);
 
-  if (!valid_gdb_inferior_id (num))
-    error (_("Inferior ID %d not known."), num);
+      if (!valid_gdb_inferior_id (num))
+       {
+         warning (_("Inferior ID %d not known."), num);
+         continue;
+       }
 
-  pid = gdb_inferior_id_to_pid (num);
+      pid = gdb_inferior_id_to_pid (num);
 
-  tp = any_thread_of_process (pid);
-  if (!tp)
-    error (_("Inferior has no threads."));
+      tp = any_thread_of_process (pid);
+      if (!tp)
+       {
+         warning (_("Inferior ID %d has no threads."), num);
+         continue;
+       }
 
-  switch_to_thread (tp->ptid);
+      switch_to_thread (tp->ptid);
 
-  detach_command (NULL, from_tty);
+      detach_command (NULL, from_tty);
+    }
 }
 
 static void
@@ -649,22 +658,31 @@ kill_inferior_command (char *args, int from_tty)
   struct thread_info *tp;
 
   if (!args || !*args)
-    error (_("Requires argument (inferior id to kill)"));
+    error (_("Requires argument (inferior id(s) to kill)"));
 
-  num = parse_and_eval_long (args);
+  while (*args != '\0')
+    {
+      num = get_number_or_range (&args);
 
-  if (!valid_gdb_inferior_id (num))
-    error (_("Inferior ID %d not known."), num);
+      if (!valid_gdb_inferior_id (num))
+       {
+         warning (_("Inferior ID %d not known."), num);
+         continue;
+       }
 
-  pid = gdb_inferior_id_to_pid (num);
+      pid = gdb_inferior_id_to_pid (num);
 
-  tp = any_thread_of_process (pid);
-  if (!tp)
-    error (_("Inferior has no threads."));
+      tp = any_thread_of_process (pid);
+      if (!tp)
+       {
+         warning (_("Inferior ID %d has no threads."), num);
+         continue;
+       }
 
-  switch_to_thread (tp->ptid);
+      switch_to_thread (tp->ptid);
 
-  target_kill ();
+      target_kill ();
+    }
 
   bfd_cache_close_all ();
 }
@@ -740,19 +758,34 @@ remove_inferior_command (char *args, int from_tty)
   int num;
   struct inferior *inf;
 
-  num = parse_and_eval_long (args);
-  inf = find_inferior_id (num);
+  if (args == NULL || *args == '\0')
+    error (_("Requires an argument (inferior id(s) to remove)"));
 
-  if (inf == NULL)
-    error (_("Inferior ID %d not known."), num);
+  while (*args != '\0')
+    {
+      num = get_number_or_range (&args);
+      inf = find_inferior_id (num);
 
-  if (inf == current_inferior ())
-    error (_("Can not remove current symbol inferior."));
+      if (inf == NULL)
+       {
+         warning (_("Inferior ID %d not known."), num);
+         continue;
+       }
+
+      if (inf == current_inferior ())
+       {
+         warning (_("Can not remove current symbol inferior %d."), num);
+         continue;
+       }
     
-  if (inf->pid != 0)
-    error (_("Can not remove an active inferior."));
+      if (inf->pid != 0)
+       {
+         warning (_("Can not remove active inferior %d."), num);
+         continue;
+       }
 
-  delete_inferior_1 (inf, 1);
+      delete_inferior_1 (inf, 1);
+    }
 }
 
 struct inferior *
@@ -1048,13 +1081,13 @@ initialize_inferiors (void)
   add_com ("add-inferior", no_class, add_inferior_command, _("\
 Add a new inferior.\n\
 Usage: add-inferior [-copies <N>] [-exec <FILENAME>]\n\
-N is the optional number of inferior to add, default is 1.\n\
+N is the optional number of inferiors to add, default is 1.\n\
 FILENAME is the file name of the executable to use\n\
 as main program."));
 
-  add_com ("remove-inferior", no_class, remove_inferior_command, _("\
-Remove inferior ID.\n\
-Usage: remove-inferior ID"));
+  add_com ("remove-inferiors", no_class, remove_inferior_command, _("\
+Remove inferior ID (or list of IDs).\n\
+Usage: remove-inferiors ID..."));
 
   add_com ("clone-inferior", no_class, clone_inferior_command, _("\
 Clone inferior ID.\n\
@@ -1064,12 +1097,12 @@ executable loaded as the copied inferior.  If -copies is not specified,\n\
 adds 1 copy.  If ID is not specified, it is the current inferior\n\
 that is cloned."));
 
-  add_cmd ("inferior", class_run, detach_inferior_command, _("\
-Detach from inferior ID."),
+  add_cmd ("inferiors", class_run, detach_inferior_command, _("\
+Detach from inferior ID (or list of IDS)."),
           &detachlist);
 
-  add_cmd ("inferior", class_run, kill_inferior_command, _("\
-Kill inferior ID."),
+  add_cmd ("inferiors", class_run, kill_inferior_command, _("\
+Kill inferior ID (or list of IDs)."),
           &killlist);
 
   add_cmd ("inferior", class_run, inferior_command, _("\
index 7096c0e6fd6cb49de413f8479d1a57560d209ca9..27164000a31aaa65612067b8fa59d5f30ee62b91 100644 (file)
@@ -3,6 +3,10 @@
        * gdb.python/py-frame.exp: Simplify the initialization phase
        using prepare_for_testing.
 
+2011-02-25  Michael Snyder  <msnyder@vmware.com>
+
+       * gdb.multi/base.exp: Add test for remove-inferiors.
+
 2011-02-25  Michael Snyder  <msnyder@vmware.com>
 
        * gdb.multi/base.exp: Add tests for info inferiors with args.
index c45b84695f40d99ddccc2de827bec5aa28c1beea..e41aff95580246ded8b03f7cf1e862b03d3ce005 100644 (file)
@@ -156,3 +156,34 @@ if { ![runto_main] } then {
 
 gdb_test "break hello" ".*"
 gdb_test "continue" "Breakpoint \[0-9\].*, hello.*"
+
+# Now let's remove the other two
+
+gdb_test_no_output "remove-inferiors 2-3" "remove-inferiors 2-3"
+
+set see1 0
+set see2 0
+set see3 0
+
+gdb_test_multiple "info inferiors" "check remove-inferiors" {
+    -re ". 3 \[^\r\n\]*${exec3}" {
+       set see3 1
+       exp_continue
+    }
+    -re ". 2 \[^\r\n\]*${exec2}" {
+       set see2 1
+       exp_continue
+    }
+    -re ". 1 \[^\r\n\]*${exec1}" {
+       set see1 1
+       exp_continue
+    }
+    -re "$gdb_prompt $" {
+       if { $see1 && !$see2 && !$see3 } then {
+           pass "check remove-inferiors"
+       } else {
+           fail "check remove-inferiors"
+       }
+    }
+}
+