From patchwork Thu Jul 3 15:13:25 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pedro Alves X-Patchwork-Id: 1897 Received: (qmail 29346 invoked by alias); 3 Jul 2014 15:40:38 -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 29304 invoked by uid 89); 3 Jul 2014 15:40:34 -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, SPF_HELO_PASS, SPF_PASS, T_RP_MATCHES_RCVD 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, 03 Jul 2014 15:40:32 +0000 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s63FDkEe011597 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 3 Jul 2014 11:13:46 -0400 Received: from brno.lan (ovpn01.gateway.prod.ext.ams2.redhat.com [10.39.146.11]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s63FDQOs021950 for ; Thu, 3 Jul 2014 11:13:45 -0400 From: Pedro Alves To: gdb-patches@sourceware.org Subject: [PATCH 9/9] Put GDB's terminal settings into effect when paginating. Date: Thu, 3 Jul 2014 16:13:25 +0100 Message-Id: <1404400406-16708-18-git-send-email-palves@redhat.com> In-Reply-To: <1404400406-16708-1-git-send-email-palves@redhat.com> References: <1404400406-16708-1-git-send-email-palves@redhat.com> When the target is resumed in the foreground, we put the inferior's terminal settings into effect, and remove stdin from the event loop. When the target stops, we put GDB's terminal settings into effect again, and re-register stdin in the event loop, ready for user input. The former is done by target_terminal_inferior, and the latter by target_terminal_ours. There's an intermediate -- target_terminal_ours_for_output -- that is called when printing output related to target events, and we don't know yet whether we'll stop the program. That puts our terminal settings into effect, enough to get proper results from our output, but leaves input wired into the inferior. If such output paginates, then we need the full target_terminal_ours in order for the user to be able to provide input to answer the pagination query. The test in this commit hangs in async-capable targets without the fix. It doesn't hang on sync targets because on those we don't unregister stdin from the event loop while the target is running (because we block in target_wait instead of in the event loop in that case). gdb/ 2014-07-03 Pedro Alves * utils.c (prompt_for_continue): Call target_terminal_ours. gdb/testsuite/ 2014-07-03 Pedro Alves * gdb.base/paginate-after-ctrl-c-running.c: New file. * gdb.base/paginate-after-ctrl-c-running.exp: New file. --- .../gdb.base/paginate-after-ctrl-c-running.c | 23 +++++++ .../gdb.base/paginate-after-ctrl-c-running.exp | 80 ++++++++++++++++++++++ gdb/utils.c | 4 ++ 3 files changed, 107 insertions(+) create mode 100644 gdb/testsuite/gdb.base/paginate-after-ctrl-c-running.c create mode 100644 gdb/testsuite/gdb.base/paginate-after-ctrl-c-running.exp diff --git a/gdb/testsuite/gdb.base/paginate-after-ctrl-c-running.c b/gdb/testsuite/gdb.base/paginate-after-ctrl-c-running.c new file mode 100644 index 0000000..6d0a3f2 --- /dev/null +++ b/gdb/testsuite/gdb.base/paginate-after-ctrl-c-running.c @@ -0,0 +1,23 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2014 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) +{ + sleep (10); + return 0; /* after sleep */ +} diff --git a/gdb/testsuite/gdb.base/paginate-after-ctrl-c-running.exp b/gdb/testsuite/gdb.base/paginate-after-ctrl-c-running.exp new file mode 100644 index 0000000..d9cae67 --- /dev/null +++ b/gdb/testsuite/gdb.base/paginate-after-ctrl-c-running.exp @@ -0,0 +1,80 @@ +# Copyright (C) 2014 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 . + +standard_testfile + +if {[prepare_for_testing "failed to prepare" $testfile $srcfile debug] == -1} { + return -1 +} + +# Send a ctrl-c while the target is running and the next output causes +# a pagination prompt. + +proc test_ctrlc_while_target_running_paginates {} { + global binfile srcfile + global gdb_prompt pagination_prompt + + set testline [gdb_get_line_number "after sleep"] + + with_test_prefix "ctrlc target running" { + if ![runto_main] then { + fail "Can't run to main" + return 0 + } + + gdb_test "b $srcfile:$testline" \ + "Breakpoint .*$srcfile, line $testline.*" \ + "set breakpoint" + + gdb_test_no_output "set height 2" + + # Wait for the "Continuing" line, indicating the program is + # running. + set test "continue" + gdb_test_multiple $test $test { + -re "Continuing" { + pass $test + } + } + + # The program sleeps 10 seconds. Wait just a bit and send a + # ctrl-c. + sleep 2 + send_gdb "\003" + + # GDB now intercepts the SIGINT and tries to let the user know + # about the spurious signal, but that paginates. Make sure + # the user can respond to the pagination query. + set test "got prompt" + gdb_test_multiple "" $test { + -re "$pagination_prompt$" { + send_gdb "\n" + exp_continue + } + -re "$gdb_prompt $" { + pass $test + } + -notransfer -re "" { + # Otherwise gdb_test_multiple considers this an error. + exp_continue + } + } + + # Confirm GDB can still process input. + gdb_test "p 1" " = 1" "GDB accepts further input" + } +} + +test_ctrlc_while_target_running_paginates diff --git a/gdb/utils.c b/gdb/utils.c index 6f47cb0..d324227 100644 --- a/gdb/utils.c +++ b/gdb/utils.c @@ -1877,6 +1877,10 @@ prompt_for_continue (void) immediate_quit++; QUIT; + + /* We'll need to handle input. */ + target_terminal_ours (); + /* On a real operating system, the user can quit with SIGINT. But not on GO32.