gdb
authorTom Tromey <tromey@redhat.com>
Tue, 21 Dec 2010 19:10:15 +0000 (19:10 +0000)
committerTom Tromey <tromey@redhat.com>
Tue, 21 Dec 2010 19:10:15 +0000 (19:10 +0000)
* 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
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.threads/execl.exp
gdb/testsuite/gdb.threads/linux-dp.exp
gdb/testsuite/gdb.threads/manythreads.exp
gdb/testsuite/gdb.threads/tls.exp
gdb/thread.c

index bc58b94897310ab78c882fce6fbe9df7a605e341..1f473ae11cf6e196c7b1dde8dcb8ff79a8078c40 100644 (file)
@@ -1,3 +1,7 @@
+2010-12-21  Tom Tromey  <tromey@redhat.com>
+
+       * thread.c (print_thread_info): Make a ui-out table in CLI mode.
+
 2010-12-20  Yao Qi  <yao@codesourcery.com>
 
        * arm-tdep.c (arm_register_reggroup_p): New.
index 9947918a2edf09a6631d18bc403a931e42e60b40..df8e1fe7722ecd16a0e3418a8fcbd5da2e5a038c 100644 (file)
@@ -1,3 +1,10 @@
+2010-12-21  Tom Tromey  <tromey@redhat.com>
+
+       * 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  <jan.kratochvil@redhat.com>
 
        * gdb.cp/nextoverthrow.cc (dummy): Return int 0.
index cd4a8015358902327587637c371856e5afd749db..9cafeda4ac4f7f2ad1fb00ff5555c77a96bcd77f 100644 (file)
@@ -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.
index fb2a2ed63031e3014d0c974dfaecde43180e6143..abb4f871ba403ad19170cd13e37bd4c54d270773 100644 (file)
@@ -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 $" {
index cfdd0e79b2a21ae404da122518f61de7e908e522..644f5f98e25e11bae12527b925df3aca04b06b68 100644 (file)
@@ -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
     }
index eb76f1a95d7462561b4da75568286212d2a1d2aa..bf21104e8678e8a41999e6f94babeb820184c6dd 100644 (file)
@@ -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 $" {
index 1be325fef62cad5c9b2f6d3c8002de6ad3edcad2..387b00a14dec1bcba52f36a27a653e5c7bf91d07 100644 (file)
@@ -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");