[binutils-gdb] Windows gdb+gdbserver: Eliminate struct pending_stop

Pedro Alves via Gdb-cvs <[email protected]>
Newsgroups gmane.comp.gdb.cvs
Message-ID <[email protected]>
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=0803ecc0b30b372686da3c3a811a8ebeed416533

commit 0803ecc0b30b372686da3c3a811a8ebeed416533
Author: Pedro Alves <[email protected]>
Date:   Wed May 17 14:34:53 2023 +0100

    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.
    
    Approved-By: Tom Tromey <[email protected]>
    Change-Id: I7955884b3f378d8b39b908f6252d215f6568b367
    commit-id:fb68c808

Diff:
---
 gdb/nat/windows-nat.h  | 21 ++++++++-------------
 gdb/windows-nat.c      | 14 +++++++-------
 gdbserver/win32-low.cc | 12 ++++++------
 3 files changed, 21 insertions(+), 26 deletions(-)

diff --git a/gdb/nat/windows-nat.h b/gdb/nat/windows-nat.h
index cb7456c624e..5258ce52a0f 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
@@ -111,9 +101,14 @@ struct windows_thread_info
    queues the stop events.  However, this can result in the strange
    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 {};
+   this scenario, we queue the "pending" stop here, and then
+   process it once the step has completed.  See PR gdb/22992.
+   If we do have a pending event, its Windows event info is in
+   LAST_EVENT.
+
+   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 062ecf1e063..e0589c4de97 100644
--- a/gdb/windows-nat.c
+++ b/gdb/windows-nat.c
@@ -727,7 +727,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",
@@ -923,18 +923,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);
@@ -1159,7 +1159,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);
@@ -1172,7 +1172,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 0741dd24ed5..e712033898c 100644
--- a/gdbserver/win32-low.cc
+++ b/gdbserver/win32-low.cc
@@ -814,7 +814,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;
     });
 
@@ -957,10 +957,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));
@@ -1120,13 +1120,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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.