From patchwork Thu Oct 22 09:59:02 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pedro Alves X-Patchwork-Id: 9306 Received: (qmail 37897 invoked by alias); 22 Oct 2015 09:59:16 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 37818 invoked by uid 89); 22 Oct 2015 09:59:15 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=AWL, BAYES_00, RP_MATCHES_RCVD, SPF_HELO_PASS autolearn=ham version=3.3.2 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Thu, 22 Oct 2015 09:59:11 +0000 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id 73116A80 for ; Thu, 22 Oct 2015 09:59:10 +0000 (UTC) Received: from brno.lan (ovpn01.gateway.prod.ext.ams2.redhat.com [10.39.146.11]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t9M9x5Fv014526 for ; Thu, 22 Oct 2015 05:59:09 -0400 From: Pedro Alves To: gdb-patches@sourceware.org Subject: [PATCH 4/6] List checkpoints in ascending order Date: Thu, 22 Oct 2015 10:59:02 +0100 Message-Id: <1445507944-9197-5-git-send-email-palves@redhat.com> In-Reply-To: <1445507944-9197-1-git-send-email-palves@redhat.com> References: <1445507944-9197-1-git-send-email-palves@redhat.com> 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-10-22 Pedro Alves PR 17539 * printcmd.c (display_command): Append new display at the end of the list. gdb/testsuite/ChangeLog: 2015-10-22 Pedro Alves PR 17539 * gdb.base/display.exp: Expect displays to be sorted in ascending order. Use multi_line. * gdb.base/solib-display.exp: Likewise. --- gdb/linux-fork.c | 35 ++++++++++++++++++++++++++++++----- gdb/testsuite/gdb.base/checkpoint.exp | 4 ++-- 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/gdb/linux-fork.c b/gdb/linux-fork.c index 9a469d4..786670a 100644 --- a/gdb/linux-fork.c +++ b/gdb/linux-fork.c @@ -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)); diff --git a/gdb/testsuite/gdb.base/checkpoint.exp b/gdb/testsuite/gdb.base/checkpoint.exp index 4a476be..e76d711 100644 --- a/gdb/testsuite/gdb.base/checkpoint.exp +++ b/gdb/testsuite/gdb.base/checkpoint.exp @@ -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" #