From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 11041 invoked by alias); 7 Jun 2011 15:24:37 -0000 Received: (qmail 11018 invoked by uid 22791); 7 Jun 2011 15:24:35 -0000 X-SWARE-Spam-Status: No, hits=-6.3 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_HI,SPF_HELO_PASS,TW_EG,TW_OC,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 15:24:14 +0000 Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id p57FODih024202 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 7 Jun 2011 11:24:14 -0400 Received: from host1.jankratochvil.net (ovpn-113-49.phx2.redhat.com [10.3.113.49]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id p57FOBrd016051 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 7 Jun 2011 11:24:13 -0400 Received: from host1.jankratochvil.net (localhost [127.0.0.1]) by host1.jankratochvil.net (8.14.4/8.14.4) with ESMTP id p57FOA7N008886 for ; Tue, 7 Jun 2011 17:24:10 +0200 Received: (from jkratoch@localhost) by host1.jankratochvil.net (8.14.4/8.14.4/Submit) id p57FOA3g008880 for gdb-patches@sourceware.org; Tue, 7 Jun 2011 17:24:10 +0200 Date: Tue, 07 Jun 2011 15:24:00 -0000 From: Jan Kratochvil To: gdb-patches@sourceware.org Subject: [patch] Fix `shell' command for async (PR 12850) Message-ID: <20110607152409.GA7600@host1.jankratochvil.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline 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/msg00095.txt.bz2 Hi, this was completely debugged by Pedro so just wrote it and posted. I mentioned+filed this problem at: Re: Sending signal to inferior program. http://sourceware.org/ml/gdb/2011-06/msg00036.html procfs.c contains such fix but #if0-ed, left it as is: /* FIXME: should we use waitpid to make sure we get the right event? Should we check the returned event? */ { #if 0 int status, ret; ret = waitpid (pi->pid, &status, 0); #else wait (NULL); #endif proc-api.c also contains dangerous wait() call but both are for procfs platforms. No regressions on {x86_64,x86_64-m32,i686}-fedora15-linux-gnu. I have not regression tested the modified PPC* file. The testcase can have false PASS (with buggy GDB) but I do not see how to avoid it. I will check it in with no comments. Thanks, Jan gdb/ 2011-06-07 Jan Kratochvil * cli/cli-cmds.c (shell_escape): Use waitpid. * rs6000-nat.c (exec_one_dummy_insn): Likewise. gdb/testsuite/ 2011-06-07 Jan Kratochvil * gdb.base/async-shell.c: New file. * gdb.base/async-shell.exp: New file. --- a/gdb/cli/cli-cmds.c +++ b/gdb/cli/cli-cmds.c @@ -750,7 +750,7 @@ shell_escape (char *arg, int from_tty) } if (pid != -1) - while ((rc = wait (&status)) != pid && rc != -1) + while ((rc = waitpid (pid, &status, 0)) != pid && rc != -1) ; else error (_("Fork failed")); --- a/gdb/rs6000-nat.c +++ b/gdb/rs6000-nat.c @@ -614,7 +614,7 @@ exec_one_dummy_insn (struct regcache *regcache) do { - pid = wait (&status); + pid = waitpid (PIDGET (inferior_ptid), &status, 0); } while (pid != PIDGET (inferior_ptid)); --- /dev/null +++ b/gdb/testsuite/gdb.base/async-shell.c @@ -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); +} --- /dev/null +++ b/gdb/testsuite/gdb.base/async-shell.exp @@ -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 + } +}