diff options
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/ada-tasks.c | 20 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/mi_task_info.exp | 67 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/mi_task_info/task_switch.adb | 70 |
5 files changed, 165 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index dcc28ec..6927bbd 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -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> diff --git a/gdb/ada-tasks.c b/gdb/ada-tasks.c index 8ab5ad5..5b82561 100644 --- a/gdb/ada-tasks.c +++ b/gdb/ada-tasks.c @@ -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); diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index f027791..3b71f14 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -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 index 0000000..e5454de --- /dev/null +++ b/gdb/testsuite/gdb.ada/mi_task_info.exp @@ -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 index 0000000..1e89462 --- /dev/null +++ b/gdb/testsuite/gdb.ada/mi_task_info/task_switch.adb @@ -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; |