[PATCH v2 31/47] Windows gdb+gdbserver: Eliminate struct pending_stop

Pedro Alves
2025-05-19T13:34:18Z

After the previous patches, struct pending_stop only contains one
field. So move that field into the windows_thread_info structure
directly, and eliminate struct pending_stop.

Change-Id: I7955884b3f378d8b39b908f6252d215f6568b367
---
gdb/nat/windows-nat.h | 17 +++++------------
gdb/windows-nat.c | 14 +++++++-------
gdbserver/win32-low.cc | 12 ++++++------
3 files changed, 18 insertions(+), 25 deletions(-)

diff --git a/gdb/nat/windows-nat.h b/gdb/nat/windows-nat.h
index d0978f899fd..4ec2f4575be 100644
--- a/gdb/nat/windows-nat.h
+++ b/gdb/nat/windows-nat.h
@@ -38,16 +38,6 @@
namespace windows_nat
{

-/* Info about a potential pending stop. Each thread holds one of
- these. See "windows_thread_info::pending_stop" for more
- information. */
-struct pending_stop
-{
- /* The target waitstatus we computed. TARGET_WAITKIND_IGNORE if the
- thread does not have a pending stop. */
- target_waitstatus status;
-};
-
struct windows_process_info;

/* Thread information structure used to track extra information about
@@ -112,8 +102,11 @@ struct windows_thread_info
effect of trying to single step thread A -- leaving all other
threads suspended -- and then seeing a stop in thread B. To handle
this scenario, we queue all such "pending" stops here, and then
- process them once the step has completed. See PR gdb/22992. */
- struct pending_stop pending_stop {};
+ process them once the step has completed. See PR gdb/22992.
+
+ TARGET_WAITKIND_IGNORE if the thread does not have a pending
+ stop. */
+ target_waitstatus pending_status;

/* The last Windows event returned by WaitForDebugEvent for this
thread. */
diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c
index bd3bc3701a6..d5112e2e2e4 100644
--- a/gdb/windows-nat.c
+++ b/gdb/windows-nat.c
@@ -1273,7 +1273,7 @@ windows_nat_target::windows_continue (DWORD continue_status, int id,
{
if ((id == -1 || id == (int) th->tid)
&& !th->suspended
- && th->pending_stop.status.kind () != TARGET_WAITKIND_IGNORE)
+ && th->pending_status.kind () != TARGET_WAITKIND_IGNORE)
{
DEBUG_EVENTS ("got matching pending stop event "
"for 0x%x, not resuming",
@@ -1465,18 +1465,18 @@ windows_nat_target::get_windows_debug_event
DWORD thread_id = 0;

/* If there is a relevant pending stop, report it now. See the
- comment by the definition of "windows_thread_info::pending_stop"
+ comment by the definition of "windows_thread_info::pending_status"
for details on why this is needed. */
for (auto &th : windows_process.thread_list)
{
if (!th->suspended
- && th->pending_stop.status.kind () != TARGET_WAITKIND_IGNORE)
+ && th->pending_status.kind () != TARGET_WAITKIND_IGNORE)
{
DEBUG_EVENTS ("reporting pending event for 0x%x", th->tid);

thread_id = th->tid;
- *ourstatus = th->pending_stop.status;
- th->pending_stop.status.set_ignore ();
+ *ourstatus = th->pending_status;
+ th->pending_status.set_ignore ();
*current_event = th->last_event;

ptid_t ptid (windows_process.process_id, thread_id);
@@ -1701,7 +1701,7 @@ windows_nat_target::get_windows_debug_event
if (th->suspended)
{
/* Pending stop. See the comment by the definition of
- "pending_stops" for details on why this is needed. */
+ "pending_status" for details on why this is needed. */
DEBUG_EVENTS ("get_windows_debug_event - "
"unexpected stop in suspended thread 0x%x",
thread_id);
@@ -1717,7 +1717,7 @@ windows_nat_target::get_windows_debug_event
th->pc_adjusted = false;
}

- th->pending_stop.status = *ourstatus;
+ th->pending_status = *ourstatus;
ourstatus->set_ignore ();

continue_last_debug_event_main_thread
diff --git a/gdbserver/win32-low.cc b/gdbserver/win32-low.cc
index 834af706786..4aaadf0d671 100644
--- a/gdbserver/win32-low.cc
+++ b/gdbserver/win32-low.cc
@@ -825,7 +825,7 @@ win32_process_target::resume (thread_resume *resume_info, size_t n)
}

if (!th->suspended
- && th->pending_stop.status.kind () != TARGET_WAITKIND_IGNORE)
+ && th->pending_status.kind () != TARGET_WAITKIND_IGNORE)
any_pending = true;
});

@@ -970,10 +970,10 @@ get_child_debug_event (DWORD *continue_status,
auto *th = static_cast<windows_thread_info *> (thread.target_data ());

if (!th->suspended
- && th->pending_stop.status.kind () != TARGET_WAITKIND_IGNORE)
+ && th->pending_status.kind () != TARGET_WAITKIND_IGNORE)
{
- *ourstatus = th->pending_stop.status;
- th->pending_stop.status.set_ignore ();
+ *ourstatus = th->pending_status;
+ th->pending_status.set_ignore ();
*current_event = th->last_event;
ptid = debug_event_ptid (current_event);
switch_to_thread (find_thread_ptid (ptid));
@@ -1133,13 +1133,13 @@ get_child_debug_event (DWORD *continue_status,
if (th != nullptr && th->suspended)
{
/* Pending stop. See the comment by the definition of
- "windows_thread_info::pending_stop" for details on why this
+ "windows_thread_info::pending_status" for details on why this
is needed. */
OUTMSG2 (("get_windows_debug_event - "
"unexpected stop in suspended thread 0x%x\n",
th->tid));
maybe_adjust_pc (*current_event);
- th->pending_stop.status = *ourstatus;
+ th->pending_status = *ourstatus;
ourstatus->set_spurious ();
}
else
--
2.49.0