Pass Ctrl-C to the target in target_terminal_inferior
authorPedro Alves <palves@redhat.com>
Tue, 12 Apr 2016 15:49:31 +0000 (16:49 +0100)
committerPedro Alves <palves@redhat.com>
Tue, 12 Apr 2016 15:57:10 +0000 (16:57 +0100)
commit93692b589dc7017d5a2fbdffdfad5f84f597d8f1
tree00da39a59755226ec1167996ac644f258a091b4f
parente42de8c7f8e7326d284f8b53f3bd6971fbf6e7b7
Pass Ctrl-C to the target in target_terminal_inferior

If the user presses Ctrl-C immediately before target_terminal_inferior
is called and the target is resumed, instead of after, the Ctrl-C ends
up pending in the quit flag until the target next stops.

remote.c has this bit to handle this:

      if (!target_is_async_p ())
{
  ofunc = signal (SIGINT, sync_remote_interrupt);
  /* If the user hit C-c before this packet, or between packets,
     pretend that it was hit right here.  */
  if (check_quit_flag ())
    sync_remote_interrupt (SIGINT);
}

But that's only reachable if async is off, while async is on by
default nowadays.  It's also obviously not reacheable on native
targets.

This patch generalizes that to all targets.

We can't remove that remote.c bit yet, until we get rid of the sync
SIGINT handler though.  That'll be done later in the series.

gdb/ChangeLog:
2016-04-12  Pedro Alves  <palves@redhat.com>

* remote.c (remote_pass_ctrlc): New function.
(init_remote_ops): Install it.
* target.c (target_terminal_inferior): Pass pending Ctrl-C to the
target.
(target_pass_ctrlc, default_target_pass_ctrlc): New functions.
* target.h (struct target_ops) <to_pass_ctrlc>: New method.
(target_pass_ctrlc, default_target_pass_ctrlc): New declarations.
* target-delegates.c: Regenerate.
gdb/ChangeLog
gdb/remote.c
gdb/target-delegates.c
gdb/target.c
gdb/target.h