[07/34] Windows gdb+gdbserver: Eliminate DONT_SUSPEND

Message ID 20240507234233.371123-8-pedro@palves.net
State New
Headers
Series Windows non-stop mode |

Commit Message

Pedro Alves May 7, 2024, 11:42 p.m. UTC
  There's a single call to thread_rec(DONT_SUSPEND), in
windows_process_info::handle_exception.

In GDB, the windows-nat.c thread_rec implementation avoids actually
calling SuspendThread on the event thread by doing:

               th->suspended = -1;

I am not exactly sure why, but it kind of looks like it is done as an
optimization, avoiding a SuspendThread call?  It is probably done for
the same reason as the code touched in the previous patch avoided
suspending the event thread.

This however gets in the way of non-stop mode, which will really want
to SuspendThread the event thread for DBG_REPLY_LATER.

In gdbserver's thread_rec implementation DONT_SUSPEND is ignored, and
thread_rec actually always suspends, which really suggests that
SuspendThread on the event thread is really not a problem.  I really
can't imagine why it would be.

DONT_SUSPEND invalidates the thread's context, but there is no need to
invalidate the context when we get an event for a thread, because we
invalidate it when we previously resumed the thread.

So, we can just remove the thread_rec call from
windows_process_info::handle_exception.  That's what this patch does.

Change-Id: I0f328542bda6d8268814ca1ee4ae7a478098ecf2
---
 gdb/nat/windows-nat.c |  4 ----
 gdb/nat/windows-nat.h |  2 --
 gdb/windows-nat.c     | 11 -----------
 3 files changed, 17 deletions(-)
  

Comments

Tom Tromey May 8, 2024, 3:12 p.m. UTC | #1
>>>>> "Pedro" == Pedro Alves <pedro@palves.net> writes:

Pedro> So, we can just remove the thread_rec call from
Pedro> windows_process_info::handle_exception.  That's what this patch does.

Makes sense.
Approved-By: Tom Tromey <tom@tromey.com>

Tom
  

Patch

diff --git a/gdb/nat/windows-nat.c b/gdb/nat/windows-nat.c
index 46fbc2bfecb..b5cfad6274b 100644
--- a/gdb/nat/windows-nat.c
+++ b/gdb/nat/windows-nat.c
@@ -366,10 +366,6 @@  windows_process_info::handle_exception (struct target_waitstatus *ourstatus,
 
   memcpy (&siginfo_er, rec, sizeof siginfo_er);
 
-  /* Record the context of the current thread.  */
-  thread_rec (ptid_t (current_event.dwProcessId, current_event.dwThreadId, 0),
-	      DONT_SUSPEND);
-
   last_sig = GDB_SIGNAL_0;
 
   switch (code)
diff --git a/gdb/nat/windows-nat.h b/gdb/nat/windows-nat.h
index 0e2093ee06d..e18edc995b5 100644
--- a/gdb/nat/windows-nat.h
+++ b/gdb/nat/windows-nat.h
@@ -101,8 +101,6 @@  struct windows_thread_info
 /* Possible values to pass to 'thread_rec'.  */
 enum thread_disposition_type
 {
-  /* Invalidate the context, but do not suspend the thread.  */
-  DONT_SUSPEND,
 };
 
 /* A single pending stop.  See "pending_stops" for more
diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c
index f53a45f657f..f5435d70ed3 100644
--- a/gdb/windows-nat.c
+++ b/gdb/windows-nat.c
@@ -542,17 +542,6 @@  windows_per_inferior::thread_rec
      (ptid_t ptid, thread_disposition_type disposition)
 {
   windows_thread_info *th = find_thread (ptid);
-
-  if (th != nullptr && !th->suspended)
-    {
-      switch (disposition)
-	{
-	case DONT_SUSPEND:
-	  th->suspended = -1;
-	  invalidate_context (th);
-	  break;
-	}
-    }
   return th;
 }