[Ada] Fix number of lines in -ada-task-info output
authorJoel Brobecker <brobecker@gnat.com>
Fri, 21 Oct 2011 18:46:06 +0000 (18:46 +0000)
committerJoel Brobecker <brobecker@gnat.com>
Fri, 21 Oct 2011 18:46:06 +0000 (18:46 +0000)
When using the new -ada-task-info command with an argument,
the output would say that there are N entries in the returned
table, (where N is the total number of tasks present in the inferior).
But, in fact, the table would only contain at most 1 entry.

This patch fixes this by properly computing the number of
tasks being displayed before giving it to the uiout.

gdb/ChangeLog:

        * ada-tasks.c (print_ada_task_info): Fix computation of
        number of tasks displayed in command output.

gdb/testsuite/ChangeLog:

        * gdb.ada/mi_task_info/task_switch.adb: New file.
        * gdb.ada/mi_task_info.exp: New file.

gdb/ChangeLog
gdb/ada-tasks.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.ada/mi_task_info.exp [new file with mode: 0644]
gdb/testsuite/gdb.ada/mi_task_info/task_switch.adb [new file with mode: 0644]

index dcc28ec47e2ff0f6e56cdcf87036690836ee918f..6927bbdb1258afb00beeaea656c5b2ea6c059026 100644 (file)
@@ -1,3 +1,8 @@
+2011-10-21  Joel Brobecker  <brobecker@adacore.com>
+
+       * ada-tasks.c (print_ada_task_info): Fix computation of
+       number of tasks displayed in command output.
+
 2011-10-20  Jan Kratochvil  <jan.kratochvil@redhat.com>
            Ulrich Weigand  <uweigand@de.ibm.com>
 
index 8ab5ad5aa630df36fe9a5339b16ace76bf798816..5b825617ad80103caea9aff51d06f042fc234e06 100644 (file)
@@ -984,7 +984,21 @@ print_ada_task_info (struct ui_out *uiout,
     target_find_new_threads ();
 
   data = get_ada_tasks_inferior_data (inf);
-  nb_tasks = VEC_length (ada_task_info_s, data->task_list);
+
+  /* Compute the number of tasks that are going to be displayed
+     in the output.  If an argument was given, there will be
+     at most 1 entry.  Otherwise, there will be as many entries
+     as we have tasks.  */
+  if (taskno_arg)
+    {
+      if (taskno_arg > 0
+         && taskno_arg <= VEC_length (ada_task_info_s, data->task_list))
+       nb_tasks = 1;
+      else
+       nb_tasks = 0;
+    }
+  else
+    nb_tasks = VEC_length (ada_task_info_s, data->task_list);
 
   nb_columns = ui_out_is_mi_like_p (uiout) ? 8 : 7;
   old_chain = make_cleanup_ui_out_table_begin_end (uiout, nb_columns,
@@ -1006,7 +1020,9 @@ print_ada_task_info (struct ui_out *uiout,
   ui_out_table_header (uiout, 1, ui_noalign, "name", "Name");
   ui_out_table_body (uiout);
 
-  for (taskno = 1; taskno <= nb_tasks; taskno++)
+  for (taskno = 1;
+       taskno <= VEC_length (ada_task_info_s, data->task_list);
+       taskno++)
     {
       const struct ada_task_info *const task_info =
        VEC_index (ada_task_info_s, data->task_list, taskno - 1);
index f027791f55402855eb332d3192517a6aa189212a..3b71f145ddd66b72fd4ea039061cb5ee0ed54cf0 100644 (file)
@@ -1,3 +1,8 @@
+2011-10-21  Joel Brobecker  <brobecker@adacore.com>
+
+       * gdb.ada/mi_task_info/task_switch.adb: New file.
+       * gdb.ada/mi_task_info.exp: New file.
+
 2011-10-21  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        * gdb.cp/expand-psymtabs-cxx.exp: New file.
diff --git a/gdb/testsuite/gdb.ada/mi_task_info.exp b/gdb/testsuite/gdb.ada/mi_task_info.exp
new file mode 100644 (file)
index 0000000..e5454de
--- /dev/null
@@ -0,0 +1,67 @@
+# Copyright 2011 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+load_lib "ada.exp"
+
+set testdir "mi_task_info"
+set testfile "${testdir}/task_switch"
+set srcfile ${srcdir}/${subdir}/${testfile}.adb
+set binfile ${objdir}/${subdir}/${testfile}
+
+file mkdir ${objdir}/${subdir}/${testdir}
+if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug additional_flags=-gnata ]] != "" } {
+  return -1
+}
+
+load_lib mi-support.exp
+set MIFLAGS "-i=mi"
+
+gdb_exit
+if [mi_gdb_start] {
+    continue
+}
+
+mi_delete_breakpoints
+mi_gdb_reinitialize_dir $srcdir/$subdir
+mi_gdb_load ${binfile}
+
+####################################
+# 1. Try catching all exceptions.  #
+####################################
+
+if ![mi_runto "task_switch.break_me"] then {
+   fail "Cannot run to main, testcase aborted"
+   return 0
+}
+
+set ada_task_info_hdr \
+  "hdr=\\\[{width=\"1\",alignment=\"-1\",col_name=\"current\",colhdr=\"\"},{width=\"3\",alignment=\"1\",col_name=\"id\",colhdr=\"ID\"},{width=\"9\",alignment=\"1\",col_name=\"task-id\",colhdr=\"TID\"},{width=\"4\",alignment=\"1\",col_name=\"thread-id\",colhdr=\"\"},{width=\"4\",alignment=\"1\",col_name=\"parent-id\",colhdr=\"P-ID\"},{width=\"3\",alignment=\"1\",col_name=\"priority\",colhdr=\"Pri\"},{width=\"22\",alignment=\"-1\",col_name=\"state\",colhdr=\"State\"},{width=\"1\",alignment=\"2\",col_name=\"name\",colhdr=\"Name\"}\\\]"
+set task_1 \
+  "{id=\"1\",task-id=\" *(0x)?\[0-9a-fA-F\]+\",thread-id=\"\[0-9\]+\",priority=\"\[0-9\]+\",state=\"(Child (Activation|Termination) Wait|Runnable)\",name=\"main_task\"}"
+set task_2 \
+  "{id=\"2\",task-id=\" *(0x)?\[0-9a-fA-F\]+\",thread-id=\"\[0-9\]+\",parent-id=\"1\",priority=\"\[0-9\]+\",state=\"(Accept or Select Term|Runnable)\",name=\"my_callee\"}"
+set task_3 \
+  "{current=\"\\*\",id=\"3\",task-id=\" *(0x)?\[0-9a-fA-F\]+\",thread-id=\"\[0-9\]+\",parent-id=\"1\",priority=\"\[0-9\]+\",state=\"Runnable\",name=\"my_caller\"}"
+
+# Get the full list of tasks...
+mi_gdb_test "-ada-task-info" \
+  "\\^done,tasks={nr_rows=\"3\",nr_cols=\"8\",$ada_task_info_hdr,body=\\\[$task_1,$task_2,$task_3\\\]}" \
+  "-ada-task-info with no argument"
+
+# Now, only get the info about task 3.
+mi_gdb_test "-ada-task-info 3" \
+  "\\^done,tasks={nr_rows=\"1\",nr_cols=\"8\",$ada_task_info_hdr,body=\\\[$task_3\\\]}" \
+  "-ada-task-info 3"
+
diff --git a/gdb/testsuite/gdb.ada/mi_task_info/task_switch.adb b/gdb/testsuite/gdb.ada/mi_task_info/task_switch.adb
new file mode 100644 (file)
index 0000000..1e89462
--- /dev/null
@@ -0,0 +1,70 @@
+--  Copyright 2011 Free Software Foundation, Inc.
+--
+--  This program is free software; you can redistribute it and/or modify
+--  it under the terms of the GNU General Public License as published by
+--  the Free Software Foundation; either version 3 of the License, or
+--  (at your option) any later version.
+--
+--  This program is distributed in the hope that it will be useful,
+--  but WITHOUT ANY WARRANTY; without even the implied warranty of
+--  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+--  GNU General Public License for more details.
+--
+--  You should have received a copy of the GNU General Public License
+--  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+procedure Task_Switch is
+
+   -------------------
+   -- Declaractions --
+   -------------------
+
+   task type Callee is
+      entry Finito;
+   end Callee;
+   type Callee_Ptr is access Callee;
+
+   task type Caller is
+   end Caller;
+   type Caller_Ptr is access Caller;
+
+   procedure Break_Me;
+
+   My_Caller : Caller_Ptr;
+   My_Callee : Callee_Ptr;
+
+   ------------
+   -- Bodies --
+   ------------
+
+   task body Callee is
+   begin
+      --  Just wait until we are told to terminate this task.
+      --  This is just to maintain this task alive.
+      accept Finito do
+         null;
+      end Finito;
+   end Callee;
+
+   task body Caller is
+   begin
+      Break_Me;
+      My_Callee.Finito;
+   end Caller;
+
+   procedure Break_Me is
+   begin
+      null;
+   end Break_Me;
+
+begin
+
+   --  Make sure to create the Callee task first... And then give it
+   --  enough time to complete its activation phase before we start
+   --  the Caller task.
+   My_Callee := new Callee;
+   delay 0.1;
+
+   My_Caller := new Caller;
+
+end Task_Switch;