From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 5410 invoked by alias); 7 Jun 2011 17:28:42 -0000 Received: (qmail 5395 invoked by uid 22791); 7 Jun 2011 17:28:40 -0000 X-SWARE-Spam-Status: No, hits=-6.4 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; Tue, 07 Jun 2011 17:28:20 +0000 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id p57HSBhx006294 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 7 Jun 2011 13:28:11 -0400 Received: from host1.jankratochvil.net (ovpn-113-49.phx2.redhat.com [10.3.113.49]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id p57HS8OG023713 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 7 Jun 2011 13:28:10 -0400 Received: from host1.jankratochvil.net (localhost [127.0.0.1]) by host1.jankratochvil.net (8.14.4/8.14.4) with ESMTP id p57HS7hN026628; Tue, 7 Jun 2011 19:28:07 +0200 Received: (from jkratoch@localhost) by host1.jankratochvil.net (8.14.4/8.14.4/Submit) id p57HS7ku026622; Tue, 7 Jun 2011 19:28:07 +0200 Date: Tue, 07 Jun 2011 17:28:00 -0000 From: Jan Kratochvil To: Pedro Alves Cc: gdb-patches@sourceware.org Subject: Re: [patch] Fix `shell' command for async (PR 12850) Message-ID: <20110607172806.GA7243@host1.jankratochvil.net> References: <20110607152409.GA7600@host1.jankratochvil.net> <201106071813.24470.pedro@codesourcery.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201106071813.24470.pedro@codesourcery.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-IsSubscribed: yes 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: 2011-06/txt/msg00099.txt.bz2 On Tue, 07 Jun 2011 19:13:24 +0200, Pedro Alves wrote: > > - while ((rc = wait (&status)) != pid && rc != -1) > > + while ((rc = waitpid (pid, &status, 0)) != pid && rc != -1) > > ; > > Pedantically, I think this could be simplified. PID is > a specific pid, not -1, and when WNOHANG is not used, > waitpid(pid, ..., 0) can only return pid or -1. > Thus, the loop only ever executes once. Oops, yes, changed. Checked in. Thanks, Jan http://sourceware.org/ml/gdb-cvs/2011-06/msg00039.html --- src/gdb/ChangeLog 2011/06/07 12:31:03 1.13083 +++ src/gdb/ChangeLog 2011/06/07 17:26:41 1.13084 @@ -1,3 +1,9 @@ +2011-06-07 Jan Kratochvil + Pedro Alves + + * cli/cli-cmds.c (shell_escape): Use waitpid. + * rs6000-nat.c (exec_one_dummy_insn): Likewise. + 2011-06-07 Tristan Gingold * xcoffread.c (dwarf2_xcoff_names): New variable. --- src/gdb/testsuite/ChangeLog 2011/06/06 13:33:07 1.2739 +++ src/gdb/testsuite/ChangeLog 2011/06/07 17:26:46 1.2740 @@ -1,3 +1,8 @@ +2011-06-07 Jan Kratochvil + + * gdb.base/async-shell.c: New file. + * gdb.base/async-shell.exp: New file. + 2011-06-06 Pedro Alves * gdb.threads/pending-step.exp: Add more context to SIGTRAP match. --- src/gdb/rs6000-nat.c 2011/01/11 15:10:01 1.104 +++ src/gdb/rs6000-nat.c 2011/06/07 17:26:45 1.105 @@ -614,7 +614,7 @@ do { - pid = wait (&status); + pid = waitpid (PIDGET (inferior_ptid), &status, 0); } while (pid != PIDGET (inferior_ptid)); --- src/gdb/cli/cli-cmds.c 2011/04/04 17:41:07 1.113 +++ src/gdb/cli/cli-cmds.c 2011/06/07 17:26:46 1.114 @@ -726,7 +726,7 @@ chdir (current_directory); #endif #else /* Can fork. */ - int rc, status, pid; + int status, pid; if ((pid = vfork ()) == 0) { @@ -750,8 +750,7 @@ } if (pid != -1) - while ((rc = wait (&status)) != pid && rc != -1) - ; + waitpid (pid, &status, 0); else error (_("Fork failed")); #endif /* Can fork. */ --- src/gdb/testsuite/gdb.base/async-shell.c +++ src/gdb/testsuite/gdb.base/async-shell.c 2011-06-07 17:27:07.593604000 +0000 @@ -0,0 +1,22 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2011 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +int +main (void) +{ + return sleep (600); +} --- src/gdb/testsuite/gdb.base/async-shell.exp +++ src/gdb/testsuite/gdb.base/async-shell.exp 2011-06-07 17:27:07.926556000 +0000 @@ -0,0 +1,42 @@ +# Copyright (C) 2011 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +set testfile async-shell +if { [prepare_for_testing ${testfile}.exp ${testfile}] } { + return -1 +} + +gdb_test_no_output "set target-async on " +gdb_test_no_output "set non-stop on" +gdb_test "run &" "Starting program: \[^\r\n\]*" + +# `sleep 5' here would workaround the bug, do not sleep here. +# "shell" could eat waitpid event from the asynchronous inferior process. + +gdb_test "shell echo foo" "foo" + +set test "interrupt" +gdb_test_multiple $test $test { + -re "interrupt\r\n$gdb_prompt " { + pass $test + } +} + +set test "process stopped" +gdb_test_multiple "" $test { + -re "\r\n\\\[process \[0-9\]+\\\] #1 stopped\\\.\r\n" { + pass $test + } +}