diff options
author | Pedro Alves <pedro@palves.net> | 2022-04-04 21:12:03 +0100 |
---|---|---|
committer | Pedro Alves <pedro@palves.net> | 2022-07-18 17:33:31 +0100 |
commit | b9ce2850e5c0cd6624a00e2fd7dae8041f04089e (patch) | |
tree | 4e8fa827e4fe93b9bcb80e3dbf70e78e2abc0893 | |
parent | dcab494170b9c6d79a08f1a50a0ce38649ddc2eb (diff) | |
download | binutils-gdb-b9ce2850e5c0cd6624a00e2fd7dae8041f04089e.tar.gz |
all-stop/synchronous RSP support thread-exit events
Currently, GDB does not understand the THREAD_EXITED stop reply in
remote all-stop mode. There's no good reason for this, it just
happened that THREAD_EXITED was only ever reported in non-stop mode so
far. This patch teaches GDB to parse that event in all-stop RSP too.
There is no need to add a qSupported feature for this, because the
server won't send a THREAD_EXITED event unless GDB explicitly asks for
it, with QThreadEvents, or with the GDB_TO_EXIT QThreadOptions option
added in the next patch.
Change-Id: Ide5d12391adf432779fe4c79526801c4a5630966
-rw-r--r-- | gdb/remote.c | 5 | ||||
-rw-r--r-- | gdbserver/server.cc | 1 |
2 files changed, 4 insertions, 2 deletions
diff --git a/gdb/remote.c b/gdb/remote.c index 18c31c3e811..090ea47aa38 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -8187,7 +8187,8 @@ remote_target::process_stop_reply (struct stop_reply *stop_reply, && status->kind () != TARGET_WAITKIND_NO_RESUMED) { /* Expedited registers. */ - if (!stop_reply->regcache.empty ()) + if (status->kind () != TARGET_WAITKIND_THREAD_EXITED + && !stop_reply->regcache.empty ()) { struct regcache *regcache = get_thread_arch_regcache (this, ptid, stop_reply->arch); @@ -8373,7 +8374,7 @@ remote_target::wait_as (ptid_t ptid, target_waitstatus *status, again. Keep waiting for events. */ rs->waiting_for_stop_reply = 1; break; - case 'N': case 'T': case 'S': case 'X': case 'W': + case 'N': case 'T': case 'S': case 'X': case 'W': case 'w': { /* There is a stop reply to handle. */ rs->waiting_for_stop_reply = 0; diff --git a/gdbserver/server.cc b/gdbserver/server.cc index 3526e1d000e..75a23e2c692 100644 --- a/gdbserver/server.cc +++ b/gdbserver/server.cc @@ -3060,6 +3060,7 @@ resume (struct thread_resume *actions, size_t num_actions) if (cs.last_status.kind () != TARGET_WAITKIND_EXITED && cs.last_status.kind () != TARGET_WAITKIND_SIGNALLED + && cs.last_status.kind () != TARGET_WAITKIND_THREAD_EXITED && cs.last_status.kind () != TARGET_WAITKIND_NO_RESUMED) current_thread->last_status = cs.last_status; |