From patchwork Fri Mar 18 19:18:20 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pedro Alves X-Patchwork-Id: 11412 Received: (qmail 118357 invoked by alias); 18 Mar 2016 19:37:52 -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 118339 invoked by uid 89); 18 Mar 2016 19:37:51 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=BAYES_00, RP_MATCHES_RCVD, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=Tag, unregister 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; Fri, 18 Mar 2016 19:37:50 +0000 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 151E26541A for ; Fri, 18 Mar 2016 19:18:49 +0000 (UTC) Received: from cascais.lan (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2IJIYkE028091 for ; Fri, 18 Mar 2016 15:18:48 -0400 From: Pedro Alves To: gdb-patches@sourceware.org Subject: [PATCH 16/30] Decouple target_interrupt from all-stop/non-stop modes Date: Fri, 18 Mar 2016 19:18:20 +0000 Message-Id: <1458328714-4938-17-git-send-email-palves@redhat.com> In-Reply-To: <1458328714-4938-1-git-send-email-palves@redhat.com> References: <1458328714-4938-1-git-send-email-palves@redhat.com> In non-stop mode, "interrupt" results in a "stop with no mode, it results in a remote interrupt request / stop with SIGINT. This is currently implemented in both the Linux and remote target backends. Move it to the core code instead, making target_interrupt specifically always about "Interrupting as if with Ctrl-C", just like it is documented. gdb/ChangeLog: yyyy-mm-dd Pedro Alves * infcmd.c (interrupt_target_1): Call target_stop is in non-stop mode. * linux-nat.c (linux_nat_interrupt): Delete. (linux_nat_add_target): Don't install linux_nat_interrupt. * remote.c (remote_interrupt_ns): Change return type to void. Throw error if interrupting the target is not supported. (remote_interrupt): Don't call the remote_stop_ns/remote_stop_as. --- gdb/infcmd.c | 6 +++++- gdb/linux-nat.c | 10 ---------- gdb/remote.c | 35 +++++++++-------------------------- 3 files changed, 14 insertions(+), 37 deletions(-) diff --git a/gdb/infcmd.c b/gdb/infcmd.c index d687116..3a0265f 100644 --- a/gdb/infcmd.c +++ b/gdb/infcmd.c @@ -3013,7 +3013,11 @@ interrupt_target_1 (int all_threads) ptid = minus_one_ptid; else ptid = inferior_ptid; - target_interrupt (ptid); + + if (non_stop) + target_stop (ptid); + else + target_interrupt (ptid); /* Tag the thread as having been explicitly requested to stop, so other parts of gdb know not to resume this thread automatically, diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c index 0829bcb..b75153c 100644 --- a/gdb/linux-nat.c +++ b/gdb/linux-nat.c @@ -4463,15 +4463,6 @@ linux_nat_stop (struct target_ops *self, ptid_t ptid) } static void -linux_nat_interrupt (struct target_ops *self, ptid_t ptid) -{ - if (non_stop) - iterate_over_lwps (ptid, linux_nat_stop_lwp, NULL); - else - linux_ops->to_interrupt (linux_ops, ptid); -} - -static void linux_nat_close (struct target_ops *self) { /* Unregister from the event loop. */ @@ -4672,7 +4663,6 @@ linux_nat_add_target (struct target_ops *t) t->to_close = linux_nat_close; t->to_stop = linux_nat_stop; - t->to_interrupt = linux_nat_interrupt; t->to_supports_multi_process = linux_nat_supports_multi_process; diff --git a/gdb/remote.c b/gdb/remote.c index d43293b..f932455 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -5811,10 +5811,10 @@ remote_interrupt_as (void) /* Non-stop version of target_interrupt. Uses `vCtrlC' to interrupt the remote target. It is undefined which thread of which process - reports the interrupt. Returns true if the packet is supported by - the server, false otherwise. */ + reports the interrupt. Throws an error if the packet is not + supported by the server. */ -static int +static void remote_interrupt_ns (void) { struct remote_state *rs = get_remote_state (); @@ -5833,12 +5833,10 @@ remote_interrupt_ns (void) case PACKET_OK: break; case PACKET_UNKNOWN: - return 0; + error (_("No support for interrupting the remote target.")); case PACKET_ERROR: error (_("Interrupting target failed: %s"), rs->buf); } - - return 1; } /* Implement the to_stop function for the remote targets. */ @@ -5864,30 +5862,15 @@ remote_stop (struct target_ops *self, ptid_t ptid) static void remote_interrupt (struct target_ops *self, ptid_t ptid) { + struct remote_state *rs = get_remote_state (); + if (remote_debug) fprintf_unfiltered (gdb_stdlog, "remote_interrupt called\n"); - if (non_stop) - { - /* In non-stop mode, we always stop with no signal instead. */ - remote_stop_ns (ptid); - } + if (target_is_non_stop_p ()) + remote_interrupt_ns (); else - { - /* In all-stop, we emulate ^C-ing the remote target's - terminal. */ - if (target_is_non_stop_p ()) - { - if (!remote_interrupt_ns ()) - { - /* No support for ^C-ing the remote target. Stop it - (with no signal) instead. */ - remote_stop_ns (ptid); - } - } - else - remote_interrupt_as (); - } + remote_interrupt_as (); } /* Ask the user what to do when an interrupt is received. */