List checkpoints in ascending order
authorPedro Alves <palves@redhat.com>
Tue, 24 Nov 2015 18:11:22 +0000 (18:11 +0000)
committerPedro Alves <palves@redhat.com>
Tue, 24 Nov 2015 18:37:26 +0000 (18:37 +0000)
Before:
     (gdb) info checkpoints
       3 process 29132 at 0x4008ad, file foo.c, line 81
       2 process 29131 at 0x4008ad, file foo.c, line 81
       1 process 29130 at 0x4008ad, file foo.c, line 81
     * 0 Thread 0x7ffff7fc5740 (LWP 29128) (main process) at 0x4008ad, file foo.c, line 81

After:
     (gdb) info checkpoints
     * 0 Thread 0x7ffff7fc5740 (LWP 29128) (main process) at 0x4008ad, file foo.c, line 81
       1 process 29130 at 0x4008ad, file foo.c, line 81
       2 process 29131 at 0x4008ad, file foo.c, line 81
       3 process 29132 at 0x4008ad, file foo.c, line 81

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

PR 17539
        * printcmd.c (display_command): Append new display at the end of
        the list.

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

PR 17539
        * gdb.base/display.exp: Expect displays to be sorted in ascending
        order.  Use multi_line.
        * gdb.base/solib-display.exp: Likewise.

gdb/ChangeLog
gdb/linux-fork.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/checkpoint.exp

index 63a8d708cda6bc79fe00489aae386d073e47d0d0..760aa80018a1f39fbba3ab1dd2d9626e57ab99fe 100644 (file)
@@ -1,3 +1,9 @@
+2015-11-24  Pedro Alves  <palves@redhat.com>
+
+       PR 17539
+        * printcmd.c (display_command): Append new display at the end of
+        the list.
+
 2015-11-24  Pedro Alves  <palves@redhat.com>
 
        PR 17539
index 9a469d4625d8513352a3cd4ea9234028c0c80568..786670aedb2ae599dc3c4afb58a2e1ebbedd0ace 100644 (file)
@@ -63,6 +63,21 @@ forks_exist_p (void)
   return (fork_list != NULL);
 }
 
+/* Return the last fork in the list.  */
+
+static struct fork_info *
+find_last_fork (void)
+{
+  struct fork_info *last;
+
+  if (fork_list == NULL)
+    return NULL;
+
+  for (last = fork_list; last->next != NULL; last = last->next)
+    ;
+  return last;
+}
+
 /* Add a fork to the internal fork list.  */
 
 struct fork_info *
@@ -83,8 +98,16 @@ add_fork (pid_t pid)
   fp = XCNEW (struct fork_info);
   fp->ptid = ptid_build (pid, pid, 0);
   fp->num = ++highest_fork_num;
-  fp->next = fork_list;
-  fork_list = fp;
+
+  if (fork_list == NULL)
+    fork_list = fp;
+  else
+    {
+      struct fork_info *last = find_last_fork ();
+
+      last->next = fp;
+    }
+
   return fp;
 }
 
@@ -353,12 +376,13 @@ linux_fork_killall (void)
 void
 linux_fork_mourn_inferior (void)
 {
+  struct fork_info *last;
+  int status;
+
   /* Wait just one more time to collect the inferior's exit status.
      Do not check whether this succeeds though, since we may be
      dealing with a process that we attached to.  Such a process will
      only report its exit status to its original parent.  */
-  int status;
-
   waitpid (ptid_get_pid (inferior_ptid), &status, 0);
 
   /* OK, presumably inferior_ptid is the one who has exited.
@@ -371,7 +395,8 @@ linux_fork_mourn_inferior (void)
      inferior_ptid yet.  */
   gdb_assert (fork_list);
 
-  fork_load_infrun_state (fork_list);
+  last = find_last_fork ();
+  fork_load_infrun_state (last);
   printf_filtered (_("[Switching to %s]\n"),
                   target_pid_to_str (inferior_ptid));
 
index 9e050c27f7c4ca9fd6776ecaa153181613992469..36bc829e4fcb5507740a31a1f915ea8cb301dd64 100644 (file)
@@ -1,3 +1,10 @@
+2015-11-24  Pedro Alves  <palves@redhat.com>
+
+       PR 17539
+        * gdb.base/display.exp: Expect displays to be sorted in ascending
+        order.  Use multi_line.
+        * gdb.base/solib-display.exp: Likewise.
+
 2015-11-24  Pedro Alves  <palves@redhat.com>
 
        PR 17539
index 4a476bee9890dcf135399c3b2550acca77447829..e76d71190f7d97313d3c98598a2e83ec1779e564 100644 (file)
@@ -87,7 +87,7 @@ gdb_test "continue 10" "breakpoint 1.*" "break1 ten"
 gdb_test "checkpoint" ".*" ""
 
 gdb_test "info checkpoints" \
-    " 10 .* 9 .* 8 .* 7 .* 6 .* 5 .* 4 .* 3 .* 2 .* 1 .*" \
+    " 1 .* 2 .* 3 .* 4 .* 5 .* 6 .* 7 .* 8 .* 9 .* 10 .*" \
     "info checkpoints one"
 
 delete_breakpoints
@@ -294,7 +294,7 @@ gdb_test "continue" \
 # There should be still at least five forks left
 # 
 
-gdb_test "info checkpoints" " 5 .* 4 .* 3 .* 2 .* 1 .*" \
+gdb_test "info checkpoints" " 1 .* 2 .* 3 .* 4 .* 5 .*" \
     "info checkpoints two"
 
 #