List inferiors/threads/pspaces in ascending order
authorPedro Alves <palves@redhat.com>
Tue, 24 Nov 2015 18:11:21 +0000 (18:11 +0000)
committerPedro Alves <palves@redhat.com>
Tue, 24 Nov 2015 18:36:31 +0000 (18:36 +0000)
Before:
  (gdb) info threads
    Id   Target Id         Frame
    3    Thread 0x7ffff77c3700 (LWP 29035) callme () at foo.c:30
    2    Thread 0x7ffff7fc4700 (LWP 29034) 0x000000000040087b in child_function_2 (arg=0x0) at foo.c:60
  * 1    Thread 0x7ffff7fc5740 (LWP 29030) 0x0000003b37209237 in pthread_join (threadid=140737353893632, thread_return=0x0) at pthread_join.c:92

After:
  (gdb) info threads
    Id   Target Id         Frame
  * 1    Thread 0x7ffff7fc5740 (LWP 29030) 0x0000003b37209237 in pthread_join (threadid=140737353893632, thread_return=0x0) at pthread_join.c:92
    2    Thread 0x7ffff7fc4700 (LWP 29034) 0x000000000040087b in child_function_2 (arg=0x0) at foo.c:60
    3    Thread 0x7ffff77c3700 (LWP 29035) callme () at foo.c:30

gdb/doc/ChangeLog:
2015-11-24  Pedro Alves  <palves@redhat.com>

PR 17539
* gdb.texinfo (Inferiors and Programs): Adjust "maint info
program-spaces" example to ascending order listing.
(Threads): Adjust "info threads" example to ascending order
listing.
(Forks): Adjust "info inferiors" example to ascending order
listing.

gdb/ChangeLog:
2015-11-24  Pedro Alves  <palves@redhat.com>

PR 17539
* inferior.c (add_inferior_silent): Append the new inferior to the
end of the list.
* progspace.c (add_program_space): Append the new pspace to the
end of the list.
* thread.c (new_thread): Append the new thread to the end of the
list.

gdb/testsuite/ChangeLog:
2015-11-24  Pedro Alves  <palves@redhat.com>

PR 17539
* gdb.base/foll-exec-mode.exp: Adjust to GDB listing inferiors and
threads in ascending order.
* gdb.base/foll-fork.exp: Likewise.
* gdb.base/foll-vfork.exp: Likewise.
* gdb.base/multi-forks.exp: Likewise.
* gdb.mi/mi-nonstop.exp: Likewise.
* gdb.mi/mi-nsintrall.exp: Likewise.
* gdb.multi/base.exp: Likewise.
* gdb.multi/multi-arch.exp: Likewise.
* gdb.python/py-inferior.exp: Likewise.
* gdb.threads/break-while-running.exp: Likewise.
* gdb.threads/execl.exp: Likewise.
* gdb.threads/gcore-thread.exp: Likewise.
* gdb.threads/info-threads-cur-sal.exp: Likewise.
* gdb.threads/kill.exp: Likewise.
* gdb.threads/linux-dp.exp: Likewise.
* gdb.threads/multiple-step-overs.exp: Likewise.
* gdb.threads/next-bp-other-thread.exp: Likewise.
* gdb.threads/step-bg-decr-pc-switch-thread.exp: Likewise.
* gdb.threads/step-over-lands-on-breakpoint.exp: Likewise.
* gdb.threads/step-over-trips-on-watchpoint.exp: Likewise.
* gdb.threads/thread-find.exp: Likewise.
* gdb.threads/tls.exp: Likewise.
* lib/mi-support.exp (mi_reverse_list): Delete.
(mi_check_thread_states): No longer reverse list.

30 files changed:
gdb/ChangeLog
gdb/doc/ChangeLog
gdb/doc/gdb.texinfo
gdb/inferior.c
gdb/progspace.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/foll-exec-mode.exp
gdb/testsuite/gdb.base/foll-fork.exp
gdb/testsuite/gdb.base/foll-vfork.exp
gdb/testsuite/gdb.base/multi-forks.exp
gdb/testsuite/gdb.mi/mi-nonstop.exp
gdb/testsuite/gdb.mi/mi-nsintrall.exp
gdb/testsuite/gdb.multi/base.exp
gdb/testsuite/gdb.multi/multi-arch.exp
gdb/testsuite/gdb.python/py-inferior.exp
gdb/testsuite/gdb.threads/break-while-running.exp
gdb/testsuite/gdb.threads/execl.exp
gdb/testsuite/gdb.threads/gcore-thread.exp
gdb/testsuite/gdb.threads/info-threads-cur-sal.exp
gdb/testsuite/gdb.threads/kill.exp
gdb/testsuite/gdb.threads/linux-dp.exp
gdb/testsuite/gdb.threads/multiple-step-overs.exp
gdb/testsuite/gdb.threads/next-bp-other-thread.exp
gdb/testsuite/gdb.threads/step-bg-decr-pc-switch-thread.exp
gdb/testsuite/gdb.threads/step-over-lands-on-breakpoint.exp
gdb/testsuite/gdb.threads/step-over-trips-on-watchpoint.exp
gdb/testsuite/gdb.threads/thread-find.exp
gdb/testsuite/gdb.threads/tls.exp
gdb/testsuite/lib/mi-support.exp
gdb/thread.c

index 9a79b056917c60a51513f6c3a61010ab1e5c42c6..63a8d708cda6bc79fe00489aae386d073e47d0d0 100644 (file)
@@ -1,3 +1,13 @@
+2015-11-24  Pedro Alves  <palves@redhat.com>
+
+       PR 17539
+       * inferior.c (add_inferior_silent): Append the new inferior to the
+       end of the list.
+       * progspace.c (add_program_space): Append the new pspace to the
+       end of the list.
+       * thread.c (new_thread): Append the new thread to the end of the
+       list.
+
 2015-11-24  Pedro Alves  <palves@redhat.com>
 
        * linux-tdep.c (find_stop_signal): Delete.
index ddf3ae5f8e51054ff53c3816f04a1e191b68f2dd..80df9ad2a12992ad90bd3266340baa96d01629ae 100644 (file)
@@ -1,3 +1,13 @@
+2015-11-24  Pedro Alves  <palves@redhat.com>
+
+       PR 17539
+       * gdb.texinfo (Inferiors and Programs): Adjust "maint info
+       program-spaces" example to ascending order listing.
+       (Threads): Adjust "info threads" example to ascending order
+       listing.
+       (Forks): Adjust "info inferiors" example to ascending order
+       listing.
+
 2015-11-04  Markus Metzger  <markus.t.metzger@intel.com>
 
        * gdb.texinfo (Process Record and Replay): Document "record
index 254403d653646ffe50ad49bec5e8dccbf7e412dd..1917008adee40b5241035bbd8e4bb16fbb5acdbc 100644 (file)
@@ -2791,9 +2791,9 @@ example, the list of inferiors bound to the program space.
 @smallexample
 (@value{GDBP}) maint info program-spaces
   Id   Executable
+* 1    hello
   2    goodbye
         Bound inferiors: ID 1 (process 21561)
-* 1    hello
 @end smallexample
 
 Here we can see that no inferior is running the program @code{hello},
@@ -2938,9 +2938,9 @@ For example,
 @smallexample
 (@value{GDBP}) info threads
   Id   Target Id         Frame
-  3    process 35 thread 27  0x34e5 in sigpause ()
-  2    process 35 thread 23  0x34e5 in sigpause ()
 * 1    process 35 thread 13  main (argc=1, argv=0x7ffffff8)
+  2    process 35 thread 23  0x34e5 in sigpause ()
+  3    process 35 thread 27  0x34e5 in sigpause ()
     at threadtest.c:68
 @end smallexample
 
@@ -3254,8 +3254,8 @@ process 12020 is executing new program: prog2
 Program exited normally.
 (@value{GDBP}) info inferiors
   Id   Description   Executable
-* 2    <null>        prog2
   1    <null>        prog1
+* 2    <null>        prog2
 @end smallexample
 
 @item same
index ae8b2a1a45a962c0f829808e2febaccb45b8e1a1..157e236f9e83debc6587b3ef753880a6259570b0 100644 (file)
@@ -135,8 +135,17 @@ add_inferior_silent (int pid)
   inf->control.stop_soon = NO_STOP_QUIETLY;
 
   inf->num = ++highest_inferior_num;
-  inf->next = inferior_list;
-  inferior_list = inf;
+
+  if (inferior_list == NULL)
+    inferior_list = inf;
+  else
+    {
+      struct inferior *last;
+
+      for (last = inferior_list; last->next != NULL; last = last->next)
+       ;
+      last->next = inf;
+    }
 
   inf->environment = make_environ ();
   init_environ (inf->environment);
index 3d7e4759772858556ef732f52a2e58fa35bcda13..ff164b8852e95eab0b81a851b6fbad70886dc3e0 100644 (file)
@@ -133,8 +133,16 @@ add_program_space (struct address_space *aspace)
 
   program_space_alloc_data (pspace);
 
-  pspace->next = program_spaces;
-  program_spaces = pspace;
+  if (program_spaces == NULL)
+    program_spaces = pspace;
+  else
+    {
+      struct program_space *last;
+
+      for (last = program_spaces; last->next != NULL; last = last->next)
+       ;
+      last->next = pspace;
+    }
 
   return pspace;
 }
index 6025f85526290cb42292d37b9558b55b1c4b9525..9e050c27f7c4ca9fd6776ecaa153181613992469 100644 (file)
@@ -1,3 +1,32 @@
+2015-11-24  Pedro Alves  <palves@redhat.com>
+
+       PR 17539
+       * gdb.base/foll-exec-mode.exp: Adjust to GDB listing inferiors and
+       threads in ascending order.
+       * gdb.base/foll-fork.exp: Likewise.
+       * gdb.base/foll-vfork.exp: Likewise.
+       * gdb.base/multi-forks.exp: Likewise.
+       * gdb.mi/mi-nonstop.exp: Likewise.
+       * gdb.mi/mi-nsintrall.exp: Likewise.
+       * gdb.multi/base.exp: Likewise.
+       * gdb.multi/multi-arch.exp: Likewise.
+       * gdb.python/py-inferior.exp: Likewise.
+       * gdb.threads/break-while-running.exp: Likewise.
+       * gdb.threads/execl.exp: Likewise.
+       * gdb.threads/gcore-thread.exp: Likewise.
+       * gdb.threads/info-threads-cur-sal.exp: Likewise.
+       * gdb.threads/kill.exp: Likewise.
+       * gdb.threads/linux-dp.exp: Likewise.
+       * gdb.threads/multiple-step-overs.exp: Likewise.
+       * gdb.threads/next-bp-other-thread.exp: Likewise.
+       * gdb.threads/step-bg-decr-pc-switch-thread.exp: Likewise.
+       * gdb.threads/step-over-lands-on-breakpoint.exp: Likewise.
+       * gdb.threads/step-over-trips-on-watchpoint.exp: Likewise.
+       * gdb.threads/thread-find.exp: Likewise.
+       * gdb.threads/tls.exp: Likewise.
+       * lib/mi-support.exp (mi_reverse_list): Delete.
+       (mi_check_thread_states): No longer reverse list.
+
 2015-11-24  Pedro Alves  <palves@redhat.com>
 
        * gdb.python/py-inferior.exp: Use with_test_prefix.  Consistently
index 3dc44a22c85d71337dd28c7e25c7a91c3c46fc06..ee193e22661b72cc80f6662c0cfd525cbd8b6a18 100644 (file)
@@ -147,7 +147,7 @@ proc do_follow_exec_mode_tests { mode cmd infswitch } {
        if {$mode == "same"} {
            set expected_re "\\* 1.*process.*"
        } else {
-           set expected_re "\\* 2.*process.*$testfile2 \r\n  1.*null.*$testfile.*"
+           set expected_re "  1.*null.*$testfile.*\r\n\\* 2.*process.*$testfile2 .*"
        }
 
        # Check that the inferior list is correct:
index 0d7c7fdf98ff0a39dd2e16c810ca16dc5c21b9cc..59939731ec2fc9970a53573379532837808d29d7 100644 (file)
@@ -144,7 +144,7 @@ proc test_follow_fork { who detach cmd } {
 
            # Follow parent / keep child: two inferiors under debug, the
            # parent is the current inferior.
-           gdb_test "info inferiors" " 2 .*process.*\\* 1 .*process.*" \
+           gdb_test "info inferiors" "\\* 1 .*process.* 2 .*process.*" \
                     "info inferiors"
 
            gdb_test "inferior 2" "Switching to inferior 2 .*"
@@ -155,14 +155,14 @@ proc test_follow_fork { who detach cmd } {
            # Follow child / detach parent: the child is under debug and is
            # the current inferior.  The parent is listed but is not under
            # debug.
-           gdb_test "info inferiors" "\\* 2 .*process.* 1 .*<null>.*" \
+           gdb_test "info inferiors" " 1 .*<null>.*\\* 2 .*process.*" \
                     "info inferiors"
 
        } elseif {$who == "child" && $detach == "off"} {
 
            # Follow child / keep parent: two inferiors under debug, the
            # child is the current inferior.
-           gdb_test "info inferiors" "\\* 2 .*process.* 1 .*process.*" \
+           gdb_test "info inferiors" " 1 .*process.*\\* 2 .*process.*" \
                     "info inferiors"
 
            gdb_test "inferior 1" "Switching to inferior 1 .*"
index 78c5cc82245b9b8449f3f7387a0a34fb1817de42..82922d82a95059399e6a3aaed2f332c34668ea64 100644 (file)
@@ -408,7 +408,7 @@ proc vfork_relations_in_info_inferiors { variant } {
    }
 
    gdb_test "info inferiors" \
-       ".*is vfork child of inferior 1.*is vfork parent of inferior 2" \
+       ".*is vfork parent of inferior 2.*is vfork child of inferior 1" \
        "info inferiors shows vfork parent/child relation"
 
    if { $variant == "exec" } {
index 0582ba4db6e4c3382f013cbcce97531035e69cb6..2b0b81d50a7660e6bdeff3d5318fa35e0a425855 100644 (file)
@@ -158,13 +158,13 @@ gdb_test_no_output "set detach off" "set detach off"
 
 for {set i 1} {$i <= 15} {incr i} {
   gdb_test "continue" "Breakpoint .* main .*exit.*" "Run to exit $i"
-  gdb_test "info inferior" " 5 .* 4 .* 3 .* 2 .*" "info inferior $i"
+  gdb_test "info inferior" " 2 .* 3 .* 4 .* 5 .*" "info inferior $i"
   gdb_test "inferior $i + 1" "(_dl_sysinfo_int80|fork|__kernel_(v|)syscall).*" \
       "inferior $i"
 }
 
 gdb_test "continue" "Breakpoint .* main .*exit.*" "Run to exit 16"
-gdb_test "info inferiors" " 5 .* 4 .* 3 .* 2 .*" "info inferior 16"
+gdb_test "info inferior" " 2 .* 3 .* 4 .* 5 .*" "info inferior 16"
 gdb_test "inferior 2" " main .*" "restart final"
 
 #
@@ -185,27 +185,9 @@ gdb_test "detach inferior 5" "Detaching .*" "Detach 5"
 # Test kill inferior
 #
 
-gdb_test_no_output "kill inferior 6" "Kill 6"
-gdb_test "info inferior 6" "<null>.*" "Did kill 6"
-gdb_test_no_output "kill inferior 7" "Kill 7"
-gdb_test "info inferior 7" "<null>.*" "Did kill 7"
-gdb_test_no_output "kill inferior 8" "Kill 8"
-gdb_test "info inferior 8" "<null>.*" "Did kill 8"
-gdb_test_no_output "kill inferior 9" "Kill 9"
-gdb_test "info inferior 9" "<null>.*" "Did kill 9"
-gdb_test_no_output "kill inferior 10" "Kill 10"
-gdb_test "info inferior 10" "<null>.*" "Did kill 10"
-gdb_test_no_output "kill inferior 11" "Kill 11"
-gdb_test "info inferior 11" "<null>.*" "Did kill 11"
-gdb_test_no_output "kill inferior 12" "Kill 12"
-gdb_test "info inferior 12" "<null>.*" "Did kill 12"
-gdb_test_no_output "kill inferior 13" "Kill 13"
-gdb_test "info inferior 13" "<null>.*" "Did kill 13"
-gdb_test_no_output "kill inferior 14" "Kill 14"
-gdb_test "info inferior 14" "<null>.*" "Did kill 14"
-gdb_test_no_output "kill inferior 15" "Kill 15"
-gdb_test "info inferior 15" "<null>.*" "Did kill 15"
-gdb_test_no_output "kill inferior 16" "Kill 16"
-gdb_test "info inferior 16" "<null>.*" "Did kill 16"
+for {set i 6} { $i <= 16} {incr i} {
+    gdb_test_no_output "kill inferior $i" "Kill $i"
+    gdb_test "info inferior $i" "<null>.*" "Did kill $i"
+}
 
 return 0
index 4678506d6802aa22a958c6560556e720364adad3..d2cb95b0a9526ce62bbb9a9aefa437981f6a3136 100644 (file)
@@ -94,7 +94,7 @@ mi_expect_interrupt "got interrupt"
 sleep 1
 mi_check_thread_states {"stopped" "stopped" "stopped"} "thread state, stop 4"
 
-mi_gdb_test "-exec-continue --all" ".*\\*running,thread-id=\"3\"\r\n\\*running,thread-id=\"2\"\r\n\\*running,thread-id=\"1\"" \
+mi_gdb_test "-exec-continue --all" ".*\\*running,thread-id=\"1\"\r\n\\*running,thread-id=\"2\"\r\n\\*running,thread-id=\"3\"" \
     "resume all"
 
 mi_expect_stop "breakpoint-hit" "break_at_me" "\[^\n\]*" "non-stop.c" "\[0-9\]*" {"" "disp=\"keep\""} "w0,i2 stop"
index d181e075a288185ba860c399cf4150b9e3807cdc..3d67a21233870245bbca2aa883d12049f0687f35 100644 (file)
@@ -67,10 +67,10 @@ mi_delete_breakpoints
 # Here we create a response string.  Note we don't want \r\n at the end,
 # since mi_gdb_test will append this itself.
 set running_re ""
-for {set i 6} {$i > 1} {incr i -1} {
+for {set i 1} {$i < 6} {incr i} {
     set running_re "$running_re\\*running,thread-id=\"$i\"\r\n"
 }
-set running_re "$running_re\\*running,thread-id=\"1\""
+set running_re "$running_re\\*running,thread-id=\"6\""
 
 mi_gdb_test "-exec-continue --all" "\[^\n\]*\r\n$running_re" \
     "resume all, no breakpoint"
index de53209af0299bea5aea61e206231c9c3f8539ab..78b913ce5c0a3d3a63cf7c08c94a557b290962f8 100644 (file)
@@ -59,7 +59,7 @@ gdb_test "add-inferior -exec ${binfile3}" \
 # Check that we have multiple spaces.
 
 gdb_test "info inferiors" \
-    "Executable.*${exec3}.*${exec2}.*${exec1}.*"
+    "Executable.*${exec1}.*${exec2}.*${exec3}.*"
 
 # Test info inferiors with args
 
@@ -68,16 +68,16 @@ set see2 0
 set see3 0
 
 gdb_test_multiple "info inferior 2 3" "info inferior 2 3" {
-    -re ". 3 \[^\r\n\]*${exec3}" {
-       set see3 1
+    -re ". 1 \[^\r\n\]*${exec1}" {
+       set see1 1
        exp_continue
     }
     -re ". 2 \[^\r\n\]*${exec2}" {
        set see2 1
        exp_continue
     }
-    -re ". 1 \[^\r\n\]*${exec1}" {
-       set see1 1
+    -re ". 3 \[^\r\n\]*${exec3}" {
+       set see3 1
        exp_continue
     }
     -re "$gdb_prompt $" {
@@ -94,16 +94,16 @@ set see2 0
 set see3 0
 
 gdb_test_multiple "info inferior 1-2" "info inferior 1-2" {
-    -re ". 3 \[^\r\n\]*${exec3}" {
-       set see3 1
+    -re ". 1 \[^\r\n\]*${exec1}" {
+       set see1 1
        exp_continue
     }
     -re ". 2 \[^\r\n\]*${exec2}" {
        set see2 1
        exp_continue
     }
-    -re ". 1 \[^\r\n\]*${exec1}" {
-       set see1 1
+    -re ". 3 \[^\r\n\]*${exec3}" {
+       set see3 1
        exp_continue
     }
     -re "$gdb_prompt $" {
index 4b255eeb29e5bf0bf0d7a1560e2db7024d92f1ae..70d0a0978b91db4f887e7e7e01f93e2d0d4ceb22 100644 (file)
@@ -95,4 +95,4 @@ if ![runto_main] then {
 # Check we do have two inferiors loaded.
 
 gdb_test "info inferiors" \
-    "Executable.*${exec2}.*${exec1}.*"
+    "Executable.*${exec1}.*${exec2}.*"
index 8a20542b2c5f6d368af520aabf76c55362253260..9966d2eb62431d274b2ee7b86b727ef76fe31f64 100644 (file)
@@ -230,10 +230,10 @@ with_test_prefix "is_valid" {
        "check inferior validity 3"
 
     gdb_test_no_output "remove-inferiors 2" "remove-inferiors 3"
-    gdb_test "python print (inf_list\[0\].is_valid())" "False" \
+    gdb_test "python print (inf_list\[0\].is_valid())" "True" \
        "check inferior validity 4"
 
-    gdb_test "python print (inf_list\[1\].is_valid())" "True" \
+    gdb_test "python print (inf_list\[1\].is_valid())" "False" \
        "check inferior validity 5"
 }
 
index e9babb1078f710942f3aaad8fec47f44c5ed91c8..ce850b15ea9c7a6d8bfc94b208ab103e6a8084e1 100644 (file)
@@ -78,7 +78,7 @@ proc test { update_thread_list always_inserted non_stop } {
     # without the user explicitly fetching the thread list.
     if {$update_thread_list} {
        gdb_test "info threads" \
-           "\\\(running\\\).*\\\(running\\\).* main .*" \
+           "main .*\\\(running\\\).*\\\(running\\\).*" \
            "only main stopped"
     }
 
@@ -107,7 +107,7 @@ proc test { update_thread_list always_inserted non_stop } {
 
     if {$non_stop == "on"} {
        gdb_test "info threads" \
-           "\\\(running\\\).* breakpoint_function .* main .*" \
+           "main .* breakpoint_function .*\\\(running\\\)" \
            "one thread running"
 
        # Unblock the other thread, which should then trip on the same
@@ -131,7 +131,7 @@ proc test { update_thread_list always_inserted non_stop } {
        }
 
        gdb_test "info threads" \
-           " breakpoint_function .* breakpoint_function .* main .*" \
+           " main .* breakpoint_function .* breakpoint_function .*" \
            "all threads stopped"
     } else {
        # This test is not merged with the non-stop one because in
@@ -142,7 +142,7 @@ proc test { update_thread_list always_inserted non_stop } {
            -re "\\\(running\\\).*$gdb_prompt $" {
                fail $test
            }
-           -re "breakpoint_function .* main .*$gdb_prompt $" {
+           -re "main .* breakpoint_function .*$gdb_prompt $" {
                pass $test
            }
        }
index 66457bdf3fc4c5c826bacd9a5192c8b71acf3b5f..b86b61281dfe19e17494a534fd2da28e4f12e450 100644 (file)
@@ -44,7 +44,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" "1 *Thread.*2 *Thread.*3 *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 7ef751f57b89cb06b8dc301dd12ae5a94794b632..812e3b81de40f63052c41d0948874d7daf4955de 100644 (file)
@@ -127,7 +127,7 @@ foreach name { corefile core0file } { with_test_prefix $name {
     # mapping various OS's may do?  Let's assume that there must
     # be at least two threads:
 
-    gdb_test "info threads" ".*${nl}  2 ${horiz}${nl}\\* 1 .*" \
+    gdb_test "info threads" "\\* 1 ${horiz}${nl}  2 ${horiz}.*" \
            "corefile contains at least two threads"
 
     # One thread in the corefile should be in the "thread2" function.
@@ -137,6 +137,6 @@ foreach name { corefile core0file } { with_test_prefix $name {
 
     # The thread2 thread should be marked as the current thread.
 
-    gdb_test "info threads" ".*${nl}\\* ${horiz} thread2 .*" \
+    gdb_test "info threads" "\\* ${horiz} thread2 .*${nl}" \
            "thread2 is current thread in corefile"
 }}
index 3cad0a2e70f3c3cc299c3f3c48b2e2efa522c3b1..529d3db3e33613b01406a77e5162fecc02235caa 100644 (file)
@@ -41,14 +41,20 @@ gdb_test "list $line" \
 # There used to be a bug where "info threads" would set the current
 # SAL to the location of the last thread displayed.
 gdb_test "info threads" \
-    "\r\n\[ \t\]*Id\[ \t\]+Target\[ \t\]+Id\[ \t\]+Frame\[ \t\]*\r\n\\* 2 *Thread \[^\r\n\]* at \[^\r\n\]*\r\n  1 *Thread \[^\r\n\]* .* \[^\r\n\]*" \
+    [multi_line \
+        "\[ \t\]*Id\[ \t\]+Target\[ \t\]+Id\[ \t\]+Frame\[ \t\]*" \
+        "  1 *Thread \[^\r\n\]* .* \[^\r\n\]*" \
+        "\\* 2 *Thread \[^\r\n\]* at \[^\r\n\]*"] \
     "info threads before break"
 
 # Check that "break" is still operating on the same file by default.
 gdb_test "break $line" ".*${srcfile2}.*" "break on line"
 
 gdb_test "info threads" \
-    "\r\n\[ \t\]*Id\[ \t\]+Target\[ \t\]+Id\[ \t\]+Frame\[ \t\]*\r\n\\* 2 *Thread \[^\r\n\]* at \[^\r\n\]*\r\n  1 *Thread \[^\r\n\]* .* \[^\r\n\]*" \
+    [multi_line \
+        "\[ \t\]*Id\[ \t\]+Target\[ \t\]+Id\[ \t\]+Frame\[ \t\]*" \
+        "  1 *Thread \[^\r\n\]* .* \[^\r\n\]*" \
+        "\\* 2 *Thread \[^\r\n\]* at \[^\r\n\]*"] \
     "info threads before list"
 
 # And that so is "list".
index b8b796515a168dce99284aea25ff6a079442c5ff..787e812951225595228820f640e07768c5f4e81a 100644 (file)
@@ -48,7 +48,7 @@ proc test {threaded} {
        gdb_continue_to_breakpoint "break here" ".*break here.*"
 
        if {$threaded} {
-           gdb_test "info threads" "6.*5.*4.*3.*2.*1.*" "all threads started"
+           gdb_test "info threads" "1.*2.*3.*4.*5.*6.*" "all threads started"
        }
 
        # This kills and ensures no output other than the prompt comes out,
index e6129789fbf86deddd57916266ffd338800012b8..a089cac4e6f69854a69bd81f127a3de038e0091d 100644 (file)
@@ -168,7 +168,7 @@ set nthreads 6
 gdb_breakpoint [gdb_get_line_number "linuxthreads.exp: info threads 2"]
 gdb_continue_to_breakpoint "main thread's sleep"
 set info_threads_ptn ".*"
-for {set i $nthreads} {$i > 0} {incr i -1} {
+for {set i 1} {$i <  $nthreads} {incr i} {
     append info_threads_ptn "$i *Thread .*"
 }
 append info_threads_ptn "\[\r\n\]+$gdb_prompt $"
index 475e0f40b081efa88c75c333abd552b3ee72d3fe..99c3e30f19827a2cf0197822a5498bc704001094 100644 (file)
@@ -46,7 +46,7 @@ proc setup {} {
 
        gdb_breakpoint [gdb_get_line_number "set wait-threads breakpoint here"]
        gdb_continue_to_breakpoint "run to breakpoint"
-       gdb_test "info threads" "3 .* 2 .*\\\* 1.*" "info threads shows all threads"
+       gdb_test "info threads" "\\\* 1 .* 2 .* 3 .*" "info threads shows all threads"
 
        gdb_test_no_output "set scheduler-locking on"
 
index 297a696650157cc2d4f91abab59b824ec7809b76..df9b73b10971eb7e7eb4c3b1bdde5510ee26d1c3 100644 (file)
@@ -35,7 +35,7 @@ foreach schedlock {"off" "step" "on" } {
 
        gdb_breakpoint [gdb_get_line_number "set wait-thread breakpoint here"]
        gdb_continue_to_breakpoint "run to wait-thread breakpoint"
-       gdb_test "info threads" "2 .*\\\* 1.*" "info threads shows all threads"
+       gdb_test "info threads" "\\\* 1 .*  2 .*" "info threads shows all threads"
 
        delete_breakpoints
 
index b19b1f7e967cff60e75336fdb04b56ee6f6d22f4..1199fb17123eff45209b014d22ba59ea6f1ce0ec 100644 (file)
@@ -48,7 +48,7 @@ delete_breakpoints
 
 gdb_breakpoint [gdb_get_line_number "set breakpoint here"]
 gdb_continue_to_breakpoint "run to nop breakpoint"
-gdb_test "info threads" "\\\* 2 .* 1.*" "info threads shows all threads"
+gdb_test "info threads" "  1 .*\\\* 2 .*" "info threads shows all threads"
 
 gdb_test "next" "while.*" "next over nop"
 
index b38f23bfad3a70b7b54fe6b88938de62483f3626..79f4aa7f0e823f01792bb919a1359b494f755b4c 100644 (file)
@@ -40,7 +40,7 @@ proc do_test {displaced command} {
 
        gdb_breakpoint [gdb_get_line_number "set wait-thread breakpoint here"]
        gdb_continue_to_breakpoint "run to wait-thread breakpoint"
-       gdb_test "info threads" "2 .*\\\* 1.*" "info threads shows all threads"
+       gdb_test "info threads" "\\\* 1 .*  2 .*" "info threads shows all threads"
 
        gdb_test_no_output "set scheduler-locking on"
 
index 7e27f97d6293b03c1570030c0663bf8dede070ab..aeedc4ac5c24f832161f247ed9311454e5af0a70 100644 (file)
@@ -59,7 +59,7 @@ proc do_test { displaced with_bp } {
 
                gdb_breakpoint [gdb_get_line_number "set wait-thread breakpoint here"]
                gdb_continue_to_breakpoint "run to wait-thread breakpoint"
-               gdb_test "info threads" "2 .*\\\* 1.*" "info threads shows all threads"
+               gdb_test "info threads" "\\\* 1 .*  2 .*" "info threads shows all threads"
 
                gdb_test_no_output "set scheduler-locking on"
 
index 1cd39de2c53736e2fc3d7ff2ba74f725e7fb05e9..1af6bbde6d7c440dcfd2764aabec76030581dd88 100644 (file)
@@ -55,29 +55,11 @@ gdb_test "thread apply 6 thread name threadname_6" \
     "name thread 6"
 
 # Collect thread ids, if any.
+
 gdb_test_multiple "info threads" "collect thread id" {
-    -re ". 6 .*\[Tt\]hread (\[0-9a-fA-Fx\]+).* \"threadname_6\" \[^\r\n\]*" {
-       set thread6 $expect_out(1,string)
-       exp_continue
-    }
-    -re ". 5 .*\[Tt\]hread (\[0-9a-fA-Fx\]+).* \"threadname_5\" \[^\r\n\]*" {
-       set thread5 $expect_out(1,string)
-       exp_continue
-    }
-    -re ". 4 .*\[Tt\]hread (\[0-9a-fA-Fx\]+).* \"threadname_4\" \[^\r\n\]*" {
-       set thread4 $expect_out(1,string)
-       exp_continue
-    }
-    -re ". 3 .*\[Tt\]hread (\[0-9a-fA-Fx\]+).* \"threadname_3\" \[^\r\n\]*" {
-       set thread3 $expect_out(1,string)
-       exp_continue
-    }
-    -re ". 2 .*\[Tt\]hread (\[0-9a-fA-Fx\]+).* \"threadname_2\" \[^\r\n\]*" {
-       set thread2 $expect_out(1,string)
-       exp_continue
-    }
-    -re ". 1 .*\[Tt\]hread (\[0-9a-fA-Fx\]+).* \"threadname_1\" \[^\r\n\]*" {
-       set thread1 $expect_out(1,string)
+    -re ". (\[0-9\]+) \[^\r\n\]*\[Tt\]hread (\[0-9a-fA-Fx\]+)\[^\r\n\]* \"threadname_\[0-9\]+\" \[^\r\n\]*" {
+       set thr_num $expect_out(1,string)
+       set thread$thr_num $expect_out(2,string)
        exp_continue
     }
     -re ".*$gdb_prompt $" {
@@ -90,29 +72,11 @@ if { [info exists thread6] } then {
 }
 
 # Collect process ids, if any.
+
 gdb_test_multiple "info threads" "collect thread id" {
-    -re ". 6 .*\[Pp\]rocess (\[0-9a-fA-Fx\]+).* \"threadname_6\" \[^\r\n\]*" {
-       set process6 $expect_out(1,string)
-       exp_continue
-    }
-    -re ". 5 .*\[Pp\]rocess (\[0-9a-fA-Fx\]+).* \"threadname_5\" \[^\r\n\]*" {
-       set process5 $expect_out(1,string)
-       exp_continue
-    }
-    -re ". 4 .*\[Pp\]rocess (\[0-9a-fA-Fx\]+).* \"threadname_4\" \[^\r\n\]*" {
-       set process4 $expect_out(1,string)
-       exp_continue
-    }
-    -re ". 3 .*\[Pp\]rocess (\[0-9a-fA-Fx\]+).* \"threadname_3\" \[^\r\n\]*" {
-       set process3 $expect_out(1,string)
-       exp_continue
-    }
-    -re ". 2 .*\[Pp\]rocess (\[0-9a-fA-Fx\]+).* \"threadname_2\" \[^\r\n\]*" {
-       set process2 $expect_out(1,string)
-       exp_continue
-    }
-    -re ". 1 .*\[Pp\]rocess (\[0-9a-fA-Fx\]+).* \"threadname_1\" \[^\r\n\]*" {
-       set process1 $expect_out(1,string)
+    -re ". (\[0-9\]+) \[^\r\n\]*\[Pp\]rocess (\[0-9a-fA-Fx\]+)\[^\r\n\]* \"threadname_\[0-9\]+\" \[^\r\n\]*" {
+       set thr_num $expect_out(1,string)
+       set process$thr_num $expect_out(2,string)
        exp_continue
     }
     -re ".*$gdb_prompt $" {
@@ -125,29 +89,11 @@ if { [info exists process6] } then {
 }
 
 # Collect lwp ids, if any.
+
 gdb_test_multiple "info threads" "collect thread id" {
-    -re ". 6 .*LWP (\[0-9a-fA-Fx\]+).* \"threadname_6\" \[^\r\n\]*" {
-       set lwp6 $expect_out(1,string)
-       exp_continue
-    }
-    -re ". 5 .*LWP (\[0-9a-fA-Fx\]+).* \"threadname_5\" \[^\r\n\]*" {
-       set lwp5 $expect_out(1,string)
-       exp_continue
-    }
-    -re ". 4 .*LWP (\[0-9a-fA-Fx\]+).* \"threadname_4\" \[^\r\n\]*" {
-       set lwp4 $expect_out(1,string)
-       exp_continue
-    }
-    -re ". 3 .*LWP (\[0-9a-fA-Fx\]+).* \"threadname_3\" \[^\r\n\]*" {
-       set lwp3 $expect_out(1,string)
-       exp_continue
-    }
-    -re ". 2 .*LWP (\[0-9a-fA-Fx\]+).* \"threadname_2\" \[^\r\n\]*" {
-       set lwp2 $expect_out(1,string)
-       exp_continue
-    }
-    -re ". 1 .*LWP (\[0-9a-fA-Fx\]+).* \"threadname_1\" \[^\r\n\]*" {
-       set lwp1 $expect_out(1,string)
+    -re ". (\[0-9\]+) \[^\r\n\]*LWP (\[0-9a-fA-Fx\]+)\[^\r\n\]* \"threadname_\[0-9\]+\" \[^\r\n\]*" {
+       set thr_num $expect_out(1,string)
+       set lwp$thr_num $expect_out(2,string)
        exp_continue
     }
     -re ".*$gdb_prompt $" {
@@ -241,36 +187,13 @@ gdb_test "thread find foobarbaz" "No threads match .*" "no thread"
 # Test regular expression
 #
 
-set see1 0
-set see2 0
-set see3 0
-set see4 0
-set see5 0
-set see6 0
-
+for {set i 1} {$i <= 6} {incr i} {
+    set see$i 0
+}
 gdb_test_multiple "thread find threadname_\[345\]" "test regular exp" {
-    -re "Thread 6 has name \[^\r\n\]*" {
-       set see6 1
-       exp_continue
-    }
-    -re "Thread 5 has name \[^\r\n\]*" {
-       set see5 1
-       exp_continue
-    }
-    -re "Thread 4 has name \[^\r\n\]*" {
-       set see4 1
-       exp_continue
-    }
-    -re "Thread 3 has name \[^\r\n\]*" {
-       set see3 1
-       exp_continue
-    }
-    -re "Thread 2 has name \[^\r\n\]*" {
-       set see2 1
-       exp_continue
-    }
-    -re "Thread 1 has name \[^\r\n\]*" {
-       set see1 1
+    -re "Thread (\[0-9\]+) has name \[^\r\n\]*" {
+       set thr_num $expect_out(1,string)
+       set see$thr_num 1
        exp_continue
     }
     -re ".*$gdb_prompt $" {
@@ -286,36 +209,13 @@ gdb_test_multiple "thread find threadname_\[345\]" "test regular exp" {
 # Test info threads on a subset of threads
 #
 
-set see1 0
-set see2 0
-set see3 0
-set see4 0
-set see5 0
-set see6 0
-
+for {set i 1} {$i <= 6} {incr i} {
+    set see$i 0
+}
 gdb_test_multiple "info threads 2 4 6" "info threads 2 4 6" {
-    -re ". 6 \[^\r\n\]*\"threadname_6\" \[^\r\n\]*" {
-       set see6 1
-       exp_continue
-    }
-    -re ". 5 \[^\r\n\]*\"threadname_5\" \[^\r\n\]*" {
-       set see5 1
-       exp_continue
-    }
-    -re ". 4 \[^\r\n\]*\"threadname_4\" \[^\r\n\]*" {
-       set see4 1
-       exp_continue
-    }
-    -re ". 3 \[^\r\n\]*\"threadname_3\" \[^\r\n\]*" {
-       set see3 1
-       exp_continue
-    }
-    -re ". 2 \[^\r\n\]*\"threadname_2\" \[^\r\n\]*" {
-       set see2 1
-       exp_continue
-    }
-    -re ". 1 \[^\r\n\]*\"threadname_1\" \[^\r\n\]*" {
-       set see1 1
+    -re ". (\[0-9\]+) \[^\r\n\]*\"threadname_\[0-9\]+\" \[^\r\n\]*" {
+       set thr_num $expect_out(1,string)
+       set see$thr_num 1
        exp_continue
     }
     -re "$gdb_prompt $" {
@@ -331,36 +231,13 @@ gdb_test_multiple "info threads 2 4 6" "info threads 2 4 6" {
 # Test info threads on a range
 #
 
-set see1 0
-set see2 0
-set see3 0
-set see4 0
-set see5 0
-set see6 0
-
+for {set i 1} {$i <= 6} {incr i} {
+    set see$i 0
+}
 gdb_test_multiple "info threads 3-5" "info threads 3-5" {
-    -re ". 6 .*\"threadname_6\" \[^\r\n\]*" {
-       set see6 1
-       exp_continue
-    }
-    -re ". 5 .*\"threadname_5\" \[^\r\n\]*" {
-       set see5 1
-       exp_continue
-    }
-    -re ". 4 .*\"threadname_4\" \[^\r\n\]*" {
-       set see4 1
-       exp_continue
-    }
-    -re ". 3 .*\"threadname_3\" \[^\r\n\]*" {
-       set see3 1
-       exp_continue
-    }
-    -re ". 2 .*\"threadname_2\" \[^\r\n\]*" {
-       set see2 1
-       exp_continue
-    }
-    -re ". 1 .*\"threadname_1\" \[^\r\n\]*" {
-       set see1 1
+    -re ". (\[0-9\]+) \[^\r\n\]*\"threadname_\[0-9\]+\" \[^\r\n\]*" {
+       set thr_num $expect_out(1,string)
+       set see$thr_num 1
        exp_continue
     }
     -re "$gdb_prompt $" {
@@ -378,36 +255,13 @@ gdb_test "info threads 5-3" "inverted range" "test inverted range"
 
 # Test degenerate range
 
-set see1 0
-set see2 0
-set see3 0
-set see4 0
-set see5 0
-set see6 0
-
+for {set i 1} {$i <= 6} {incr i} {
+    set see$i 0
+}
 gdb_test_multiple "info threads 3-3" "info threads 3-3" {
-    -re ". 6 .*\"threadname_6\" \[^\r\n\]*" {
-       set see6 1
-       exp_continue
-    }
-    -re ". 5 .*\"threadname_5\" \[^\r\n\]*" {
-       set see5 1
-       exp_continue
-    }
-    -re ". 4 .*\"threadname_4\" \[^\r\n\]*" {
-       set see4 1
-       exp_continue
-    }
-    -re ". 3 .*\"threadname_3\" \[^\r\n\]*" {
-       set see3 1
-       exp_continue
-    }
-    -re ". 2 .*\"threadname_2\" \[^\r\n\]*" {
-       set see2 1
-       exp_continue
-    }
-    -re ". 1 .*\"threadname_1\" \[^\r\n\]*" {
-       set see1 1
+    -re ". (\[0-9\]+) .*\"threadname_\[0-9\]+\" \[^\r\n\]*" {
+       set thr_num $expect_out(1,string)
+       set see$thr_num 1
        exp_continue
     }
     -re ".*$gdb_prompt $" {
index 3e74899fb697e7cf6e7882205382b5982d356517..8d322dbdad8c4c623761bfdf22e6955c439be2b0 100644 (file)
@@ -205,7 +205,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\]+ *Id .*Frame\[ \t\r\n\]+(\[0-9\]+) *Thread.*$gdb_prompt $" {
+    -re "^info thread\[ \t\r\n\]+ *Id .*Frame\[ \t\r\n\]+.*(\[0-9\]+) *Thread\[^\r\n\]+\r\n$gdb_prompt $" {
           set no_of_threads $expect_out(1,string)
           pass "get number of threads"
         }
index dd6c41ace1b48bd9081039e316ba133a037c8af4..07a84eacd691d9132c899ecc7e01a8753bae379d 100644 (file)
@@ -1965,19 +1965,8 @@ proc mi_load_shlibs { args } {
     mi_gdb_test "set solib-search-path [file dirname [lindex $args 0]]" "\^done" ""
 }
 
-proc mi_reverse_list { list } {
-    if { [llength $list] <= 1 } {
-       return $list
-    }
-    set tail [lrange $list 1 [llength $list]]
-    set rtail [mi_reverse_list $tail]
-    lappend rtail [lindex $list 0]
-    return $rtail
-}
-
-proc mi_check_thread_states { xstates test } {
+proc mi_check_thread_states { states test } {
     global expect_out
-    set states [mi_reverse_list $xstates]
     set pattern ".*\\^done,threads=\\\["
     foreach s $states {
        set pattern "${pattern}(.*)state=\"$s\""
index 6d410fb8f5a0aa304e31ee6559a10ef1d0c3986f..b47d9901a8bd6ba5d19144ed2cd8a0777587b69b 100644 (file)
@@ -236,8 +236,17 @@ new_thread (ptid_t ptid)
 
   tp->ptid = ptid;
   tp->num = ++highest_thread_num;
-  tp->next = thread_list;
-  thread_list = tp;
+
+  if (thread_list == NULL)
+    thread_list = tp;
+  else
+    {
+      struct thread_info *last;
+
+      for (last = thread_list; last->next != NULL; last = last->next)
+       ;
+      last->next = tp;
+    }
 
   /* Nothing to follow yet.  */
   tp->pending_follow.kind = TARGET_WAITKIND_SPURIOUS;