From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 10114 invoked by alias); 20 Dec 2010 21:50:45 -0000 Received: (qmail 10104 invoked by uid 22791); 20 Dec 2010 21:50:44 -0000 X-SWARE-Spam-Status: No, hits=-6.9 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_HI,SPF_HELO_PASS,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 20 Dec 2010 21:50:37 +0000 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id oBKLoZUH001712 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 20 Dec 2010 16:50:36 -0500 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id oBKLoZl1003479; Mon, 20 Dec 2010 16:50:35 -0500 Received: from opsy.redhat.com (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id oBKLoY4Q005706; Mon, 20 Dec 2010 16:50:34 -0500 Received: by opsy.redhat.com (Postfix, from userid 500) id 60096378282; Mon, 20 Dec 2010 14:50:34 -0700 (MST) From: Tom Tromey To: gdb-patches@sourceware.org Subject: RFC: add table headers to "info thread" output Date: Mon, 20 Dec 2010 21:50:00 -0000 Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2010-12/txt/msg00368.txt.bz2 I would appreciate comments on this. In the absence of comments I will check it in a few days. On the CLI, "info threads" displays a table without any column headings. This patch adds column headings. In order to retain MI compatibility, the code now checks the ui-out object and reverts to the old style for MI. Built and regtested on x86-64 (compile farm). I updated various tests to reflect the new syntax. Tom 2010-12-20 Tom Tromey * thread.c (print_thread_info): Make a ui-out table in CLI mode. 2010-12-20 Tom Tromey * gdb.threads/execl.exp: Update. * gdb.threads/linux-dp.exp: Update. * gdb.threads/manythreads.exp: Update. * gdb.threads/tls.exp: Update. diff --git a/gdb/testsuite/gdb.threads/execl.exp b/gdb/testsuite/gdb.threads/execl.exp index cd4a801..9cafeda 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 fb2a2ed..abb4f87 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 cfdd0e7..644f5f9 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 eb76f1a..bf21104 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 1be325f..88dc24f 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");