From a7658b96f67e54d6579cb145677d19ae7ac93619 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Tue, 21 Dec 2010 19:10:15 +0000 Subject: [PATCH] gdb * thread.c (print_thread_info): Make a ui-out table in CLI mode. gdb/testsuite * gdb.threads/execl.exp: Update. * gdb.threads/linux-dp.exp: Update. * gdb.threads/manythreads.exp: Update. * gdb.threads/tls.exp: Update. --- gdb/ChangeLog | 4 ++ gdb/testsuite/ChangeLog | 7 +++ gdb/testsuite/gdb.threads/execl.exp | 2 +- gdb/testsuite/gdb.threads/linux-dp.exp | 18 ++++--- gdb/testsuite/gdb.threads/manythreads.exp | 2 +- gdb/testsuite/gdb.threads/tls.exp | 6 +-- gdb/thread.c | 65 ++++++++++++++++++++--- 7 files changed, 87 insertions(+), 17 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index bc58b948973..1f473ae11cf 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,7 @@ +2010-12-21 Tom Tromey + + * thread.c (print_thread_info): Make a ui-out table in CLI mode. + 2010-12-20 Yao Qi * arm-tdep.c (arm_register_reggroup_p): New. diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 9947918a2ed..df8e1fe7722 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2010-12-21 Tom Tromey + + * gdb.threads/execl.exp: Update. + * gdb.threads/linux-dp.exp: Update. + * gdb.threads/manythreads.exp: Update. + * gdb.threads/tls.exp: Update. + 2010-12-15 Jan Kratochvil * gdb.cp/nextoverthrow.cc (dummy): Return int 0. diff --git a/gdb/testsuite/gdb.threads/execl.exp b/gdb/testsuite/gdb.threads/execl.exp index cd4a8015358..9cafeda4ac4 100644 --- a/gdb/testsuite/gdb.threads/execl.exp +++ b/gdb/testsuite/gdb.threads/execl.exp @@ -46,7 +46,7 @@ gdb_test "b [gdb_get_line_number "breakpoint here"]" \ gdb_test "continue" ".*breakpoint here.*" "continue to exec" -gdb_test "info threads" ".*3 Thread.*2 Thread.*1 Thread.*" "info threads before exec" +gdb_test "info threads" ".*3 *Thread.*2 *Thread.*1 *Thread.*" "info threads before exec" # When continuing from this point we'll hit the breakpoint in main() # again, this time in the exec'd process. diff --git a/gdb/testsuite/gdb.threads/linux-dp.exp b/gdb/testsuite/gdb.threads/linux-dp.exp index fb2a2ed6303..abb4f871ba4 100644 --- a/gdb/testsuite/gdb.threads/linux-dp.exp +++ b/gdb/testsuite/gdb.threads/linux-dp.exp @@ -70,7 +70,10 @@ for {set i 0} {$i < 5} {incr i} { -re "info threads\r\n" { exp_continue } - -re "^. +(\[0-9\]+ Thread \[-0-9a-fx\]+) \[^\n\]*\n" { + -re "^ *Id.*Frame *\[\r\n\]+" { + exp_continue + } + -re "^. +(\[0-9\]+ *Thread \[-0-9a-fx\]+) \[^\n\]*\n" { verbose -log "found thread $expect_out(1,string)" 2 lappend threads_before $expect_out(1,string) exp_continue @@ -136,7 +139,10 @@ for {set i 0} {$i < 5} {incr i} { -re "info threads\r\n" { exp_continue } - -re "^. +(\[0-9\]+ Thread \[-0-9a-fx\]+) \[^\n\]*\n" { + -re "^ *Id.*Frame *\[\r\n\]+" { + exp_continue + } + -re "^. +(\[0-9\]+ *Thread \[-0-9a-fx\]+) \[^\n\]*\n" { set name $expect_out(1,string) for {set j 0} {$j != [llength $threads_before] } {incr j} { if {$name == [lindex $threads_before $j]} { @@ -177,12 +183,12 @@ set nthreads 6 # Run until there are some threads. gdb_breakpoint [gdb_get_line_number "linuxthreads.exp: info threads 2"] gdb_continue_to_breakpoint "main thread's sleep" -set info_threads_ptn "" +set info_threads_ptn ".*" for {set i $nthreads} {$i > 0} {incr i -1} { - append info_threads_ptn "$i Thread .*" + append info_threads_ptn "$i *Thread .*" } append info_threads_ptn "\[\r\n\]+$gdb_prompt $" -set info_threads_manager_ptn "[expr $nthreads + 1] Thread .*$info_threads_ptn" +set info_threads_manager_ptn "[expr $nthreads + 1] *Thread .*$info_threads_ptn" gdb_test_multiple "info threads" "info threads 2" { -re "$info_threads_manager_ptn" { @@ -245,7 +251,7 @@ set only_five 1 for {set i 0} {$only_five > 0 && $i < 10} {incr i} { gdb_continue_to_breakpoint "thread 5's print, pass: $i" gdb_test_multiple "info threads" "" { - -re "\\* 5 Thread .* print_philosopher .*\r\n$gdb_prompt $" { + -re "\[*\] 5 *Thread .* +print_philosopher .*\r\n$gdb_prompt $" { # Okay this time. } -re ".*$gdb_prompt $" { diff --git a/gdb/testsuite/gdb.threads/manythreads.exp b/gdb/testsuite/gdb.threads/manythreads.exp index cfdd0e79b2a..644f5f98e25 100644 --- a/gdb/testsuite/gdb.threads/manythreads.exp +++ b/gdb/testsuite/gdb.threads/manythreads.exp @@ -82,7 +82,7 @@ gdb_test_multiple "" "stop threads 1" { set cmd "info threads" set ok 0 gdb_test_multiple $cmd $cmd { - -re " 1 Thread " { + -re " 1 *Thread " { set ok 1 exp_continue } diff --git a/gdb/testsuite/gdb.threads/tls.exp b/gdb/testsuite/gdb.threads/tls.exp index eb76f1a95d7..bf21104e867 100644 --- a/gdb/testsuite/gdb.threads/tls.exp +++ b/gdb/testsuite/gdb.threads/tls.exp @@ -214,7 +214,7 @@ gdb_test "continue" ".*Breakpoint 3.*still alive.*" "continue to synch point" set no_of_threads 0 send_gdb "info thread\n" gdb_expect { - -re "^info thread\[ \t\r\n\]+(\[0-9\]+) Thread.*$gdb_prompt $" { + -re "^info thread\[ \t\r\n\]+ *Id .*Frame\[ \t\r\n\]|(\[0-9\]+) *Thread.*$gdb_prompt $" { set no_of_threads $expect_out(1,string) pass "get number of threads" } @@ -262,10 +262,10 @@ gdb_test "continue" ".*Breakpoint 4.*before exit.*" "threads exited" send_gdb "info thread\n" gdb_expect { - -re ".* 1 Thread.*2 Thread.*$gdb_prompt $" { + -re ".* 1 *Thread.*2 *Thread.*$gdb_prompt $" { fail "Too many threads left at end" } - -re ".*\\\* 1 Thread.*main.*$gdb_prompt $" { + -re ".*\\\* 1 *Thread.*main.*$gdb_prompt $" { pass "Expect only base thread at end" } -re ".*No stack.*$gdb_prompt $" { diff --git a/gdb/thread.c b/gdb/thread.c index 1be325fef62..387b00a14de 100644 --- a/gdb/thread.c +++ b/gdb/thread.c @@ -778,7 +778,49 @@ print_thread_info (struct ui_out *uiout, int requested_thread, int pid) /* We'll be switching threads temporarily. */ old_chain = make_cleanup_restore_current_thread (); - make_cleanup_ui_out_list_begin_end (uiout, "threads"); + /* For backward compatibility, we make a list for MI. A table is + preferable for the CLI, though, because it shows table + headers. */ + if (ui_out_is_mi_like_p (uiout)) + make_cleanup_ui_out_list_begin_end (uiout, "threads"); + else + { + int n_threads = 0; + + for (tp = thread_list; tp; tp = tp->next) + { + if (requested_thread != -1 && tp->num != requested_thread) + continue; + + if (pid != -1 && PIDGET (tp->ptid) != pid) + continue; + + if (tp->state_ == THREAD_EXITED) + continue; + + ++n_threads; + } + + if (n_threads == 0) + { + if (requested_thread == -1) + ui_out_message (uiout, 0, _("No threads.\n")); + else + ui_out_message (uiout, 0, _("No thread %d.\n"), requested_thread); + do_cleanups (old_chain); + return; + } + + make_cleanup_ui_out_table_begin_end (uiout, 5, n_threads, "threads"); + + ui_out_table_header (uiout, 1, ui_left, "current", ""); + ui_out_table_header (uiout, 4, ui_left, "id", "Id"); + ui_out_table_header (uiout, 17, ui_left, "target-id", "Target Id"); + ui_out_table_header (uiout, 1, ui_noalign, "details", ""); + ui_out_table_header (uiout, 1, ui_left, "frame", "Frame"); + ui_out_table_body (uiout); + } + for (tp = thread_list; tp; tp = tp->next) { struct cleanup *chain2; @@ -802,13 +844,23 @@ print_thread_info (struct ui_out *uiout, int requested_thread, int pid) chain2 = make_cleanup_ui_out_tuple_begin_end (uiout, NULL); - if (ptid_equal (tp->ptid, current_ptid)) - ui_out_text (uiout, "* "); + if (ui_out_is_mi_like_p (uiout)) + { + /* Compatibility. */ + if (ptid_equal (tp->ptid, current_ptid)) + ui_out_text (uiout, "* "); + else + ui_out_text (uiout, " "); + } else - ui_out_text (uiout, " "); + { + if (ptid_equal (tp->ptid, current_ptid)) + ui_out_field_string (uiout, "current", "*"); + else + ui_out_field_skip (uiout, "current"); + } ui_out_field_int (uiout, "id", tp->num); - ui_out_text (uiout, " "); ui_out_field_string (uiout, "target-id", target_pid_to_str (tp->ptid)); extra_info = target_extra_thread_info (tp); @@ -818,7 +870,8 @@ print_thread_info (struct ui_out *uiout, int requested_thread, int pid) ui_out_field_string (uiout, "details", extra_info); ui_out_text (uiout, ")"); } - ui_out_text (uiout, " "); + else if (! ui_out_is_mi_like_p (uiout)) + ui_out_field_skip (uiout, "details"); if (tp->state_ == THREAD_RUNNING) ui_out_text (uiout, "(running)\n");