From 467b267632bcc7276dbdf09ee3f9275a79e9f1ae Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Wed, 17 May 2023 14:34:53 +0100 Subject: Windows gdb+gdbserver: Eliminate struct pending_stop 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 af96811..6283ff0 100644 --- a/gdb/nat/windows-nat.h +++ b/gdb/nat/windows-nat.h @@ -32,16 +32,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 @@ -106,8 +96,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 4871d18..f71a741 100644 --- a/gdb/windows-nat.c +++ b/gdb/windows-nat.c @@ -1364,7 +1364,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", @@ -1569,18 +1569,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); @@ -1805,7 +1805,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); @@ -1821,7 +1821,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 4707acc..004bf94 100644 --- a/gdbserver/win32-low.cc +++ b/gdbserver/win32-low.cc @@ -848,7 +848,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; } @@ -992,10 +992,10 @@ get_child_debug_event (DWORD *continue_status, auto *th = (windows_thread_info *) thread_target_data (thread); 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)); @@ -1155,13 +1155,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 -- cgit v1.1