[16/30] Decouple target_interrupt from all-stop/non-stop modes
Commit Message
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 <palves@redhat.com>
* 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(-)
Comments
On 16-03-18 03:18 PM, Pedro Alves wrote:
> In non-stop mode, "interrupt" results in a "stop with no mode, it
> results in a remote interrupt request / stop with SIGINT. This is
I don't really understand the first sentence, is there something missing?
> 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.
On 03/21/2016 06:21 PM, Simon Marchi wrote:
> On 16-03-18 03:18 PM, Pedro Alves wrote:
>> In non-stop mode, "interrupt" results in a "stop with no mode, it
>> results in a remote interrupt request / stop with SIGINT. This is
>
> I don't really understand the first sentence, is there something missing?
Urgh, yes, looks like I deleted a line or something.
It should have read:
In non-stop mode, "interrupt" results in a "stop with no signal",
while in all-stop 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.
Thanks,
Pedro Alves
@@ -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,
@@ -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;
@@ -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. */