diff options
author | Pedro Alves <pedro@palves.net> | 2020-07-04 20:51:36 +0100 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2020-07-10 23:50:39 +0100 |
commit | d6cc5d980a902d273d424c49fc55e77757c3a05d (patch) | |
tree | 4c08ab5c21adbe84c357e708b682e9be6a974c65 /gdb/nds32-tdep.c | |
parent | 7d3badc6a88b510f96c9aa0bab8f3375292d23bf (diff) | |
download | gdb-d6cc5d980a902d273d424c49fc55e77757c3a05d.zip gdb-d6cc5d980a902d273d424c49fc55e77757c3a05d.tar.gz gdb-d6cc5d980a902d273d424c49fc55e77757c3a05d.tar.bz2 |
Make handle_no_resumed transfer terminal
Let's consider the same use case as in the previous commit:
Say you have two inferiors 1 and 2, each connected to a different
target, A and B.
Now say you set inferior 2 running, with "continue &".
Now you select a thread of inferior 1, say thread 1.2, and continue in
the foreground. All other threads of inferior 1 are left stopped.
Thread 1.2 exits, and thus target A has no other resumed thread, so it
reports TARGET_WAITKIND_NO_RESUMED.
At this point, because the threads of inferior 2 are still executing
the TARGET_WAITKIND_NO_RESUMED event is ignored.
Now, the user types Ctrl-C. Because GDB had previously put inferior 1
in the foreground, the kernel sends the SIGINT to that inferior.
However, no thread in that inferior is executing right now, so ptrace
never intercepts the SIGINT -- it is never dequeued by any thread.
The result is that GDB's CLI is stuck. There's no way to get back the
prompt (unless inferior 2 happens to report some event).
The fix in this commit is to make handle_no_resumed give the terminal
to some other inferior that still has threads executing so that a
subsequent Ctrl-C reaches that target first (and then GDB intercepts
the SIGINT). This is a bit hacky, but seems like the best we can do
with the current design.
I think that putting all native inferiors in their own session would
help fixing this in a clean way, since with that a Ctrl-C on GDB's
terminal will _always_ reach GDB first, and then GDB can decide how to
pause the inferior. But that's a much larger change.
The testcase added by the following patch needs this fix.
gdb/ChangeLog:
PR gdb/26199
* infrun.c (handle_no_resumed): Transfer terminal to inferior with
executing threads.
Diffstat (limited to 'gdb/nds32-tdep.c')
0 files changed, 0 insertions, 0 deletions