[binutils-gdb] Windows gdb+gdbserver: New find_thread, replaces thread_rec(DONT_INVALIDATE_CONTEXT)

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=734a60d0a7461bb8c9b9077514b7568172926658

commit 734a60d0a7461bb8c9b9077514b7568172926658
Author: Pedro Alves <[email protected]>
Date:   Mon May 8 17:09:58 2023 +0100

    Windows gdb+gdbserver: New find_thread, replaces thread_rec(DONT_INVALIDATE_CONTEXT)
    
    The goal of the next few patches is to eliminate thread_rec
    completely.  This is the first patch in that effort.
    
    thread_rec(DONT_INVALIDATE_CONTEXT) is really just a thread lookup
    with no side effects, so this adds a find_thread function that lets
    you do that.
    
    Approved-By: Tom Tromey <[email protected]>
    Change-Id: Ie486badce00e234b10caa478b066c34537103e3f

Diff:
---
 gdb/nat/windows-nat.c  |  5 ++--
 gdb/nat/windows-nat.h  |  7 +++---
 gdb/windows-nat.c      | 68 +++++++++++++++++++++++++-------------------------
 gdb/windows-nat.h      |  1 +
 gdb/x86-windows-nat.c  |  5 ++--
 gdbserver/win32-low.cc | 32 +++++++++++++-----------
 gdbserver/win32-low.h  |  1 +
 7 files changed, 62 insertions(+), 57 deletions(-)

diff --git a/gdb/nat/windows-nat.c b/gdb/nat/windows-nat.c
index a74bab75238..cefd335f652 100644
--- a/gdb/nat/windows-nat.c
+++ b/gdb/nat/windows-nat.c
@@ -315,9 +315,8 @@ windows_process_info::handle_ms_vc_exception (const EXCEPTION_RECORD *rec)
       if (named_thread_id == (DWORD) -1)
 	named_thread_id = current_event.dwThreadId;
 
-      named_thread = thread_rec (ptid_t (current_event.dwProcessId,
-					 named_thread_id, 0),
-				 DONT_INVALIDATE_CONTEXT);
+      named_thread = find_thread (ptid_t (current_event.dwProcessId,
+					  named_thread_id, 0));
       if (named_thread != NULL)
 	{
 	  int thread_name_len;
diff --git a/gdb/nat/windows-nat.h b/gdb/nat/windows-nat.h
index f4b3669df1b..32f055a7a52 100644
--- a/gdb/nat/windows-nat.h
+++ b/gdb/nat/windows-nat.h
@@ -111,9 +111,6 @@ struct windows_thread_info
 /* Possible values to pass to 'thread_rec'.  */
 enum thread_disposition_type
 {
-  /* Do not invalidate the thread's context, and do not suspend the
-     thread.  */
-  DONT_INVALIDATE_CONTEXT,
   /* Invalidate the context, but do not suspend the thread.  */
   DONT_SUSPEND,
   /* Invalidate the context and suspend the thread.  */
@@ -184,6 +181,10 @@ struct windows_process_info
   bool ignore_first_breakpoint = false;
 #endif
 
+  /* Find a thread record given a thread id.
+
+     This function must be supplied by the embedding application.  */
+  virtual windows_thread_info *find_thread (ptid_t ptid) = 0;
 
   /* Find a thread record given a thread id.  THREAD_DISPOSITION
      controls whether the thread is suspended, and whether the context
diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c
index 65dfc0c1800..46385ff87c5 100644
--- a/gdb/windows-nat.c
+++ b/gdb/windows-nat.c
@@ -264,34 +264,38 @@ windows_nat_target::wait_for_debug_event_main_thread (DEBUG_EVENT *event)
 /* See nat/windows-nat.h.  */
 
 windows_thread_info *
-windows_per_inferior::thread_rec
-     (ptid_t ptid, thread_disposition_type disposition)
+windows_per_inferior::find_thread (ptid_t ptid)
 {
   for (auto &th : thread_list)
     if (th->tid == ptid.lwp ())
-      {
-	if (!th->suspended)
-	  {
-	    switch (disposition)
-	      {
-	      case DONT_INVALIDATE_CONTEXT:
-		/* Nothing.  */
-		break;
-	      case INVALIDATE_CONTEXT:
-		if (ptid.lwp () != current_event.dwThreadId)
-		  th->suspend ();
-		th->reload_context = true;
-		break;
-	      case DONT_SUSPEND:
-		th->reload_context = true;
-		th->suspended = -1;
-		break;
-	      }
-	  }
-	return th.get ();
-      }
+      return th.get ();
+  return nullptr;
+}
+
+/* See nat/windows-nat.h.  */
 
-  return NULL;
+windows_thread_info *
+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 INVALIDATE_CONTEXT:
+	  if (ptid.lwp () != current_event.dwThreadId)
+	    th->suspend ();
+	  th->reload_context = true;
+	  break;
+	case DONT_SUSPEND:
+	  th->reload_context = true;
+	  th->suspended = -1;
+	  break;
+	}
+    }
+  return th;
 }
 
 /* Add a thread to the thread list.
@@ -310,7 +314,7 @@ windows_nat_target::add_thread (ptid_t ptid, HANDLE h, void *tlb,
 
   gdb_assert (ptid.lwp () != 0);
 
-  if ((th = windows_process->thread_rec (ptid, DONT_INVALIDATE_CONTEXT)))
+  if ((th = windows_process->find_thread (ptid)))
     return th;
 
   CORE_ADDR base = (CORE_ADDR) (uintptr_t) tlb;
@@ -434,8 +438,7 @@ windows_nat_target::store_registers (struct regcache *regcache, int r)
 bool
 windows_nat_target::stopped_by_sw_breakpoint ()
 {
-  windows_thread_info *th
-    = windows_process->thread_rec (inferior_ptid, DONT_INVALIDATE_CONTEXT);
+  windows_thread_info *th = windows_process->find_thread (inferior_ptid);
   return th->stopped_at_software_breakpoint;
 }
 
@@ -843,7 +846,7 @@ windows_nat_target::resume (ptid_t ptid, int step, enum gdb_signal sig)
 	      ptid.pid (), (unsigned) ptid.lwp (), step, sig);
 
   /* Get context for currently selected thread.  */
-  th = windows_process->thread_rec (inferior_ptid, DONT_INVALIDATE_CONTEXT);
+  th = windows_process->find_thread (inferior_ptid);
   if (th != nullptr && step)
     {
       /* Single step by setting t bit.  */
@@ -2510,7 +2513,7 @@ windows_nat_target::get_tib_address (ptid_t ptid, CORE_ADDR *addr)
 {
   windows_thread_info *th;
 
-  th = windows_process->thread_rec (ptid, DONT_INVALIDATE_CONTEXT);
+  th = windows_process->find_thread (ptid);
   if (th == NULL)
     return false;
 
@@ -2531,9 +2534,7 @@ windows_nat_target::get_ada_task_ptid (long lwp, ULONGEST thread)
 const char *
 windows_nat_target::thread_name (struct thread_info *thr)
 {
-  windows_thread_info *th
-    = windows_process->thread_rec (thr->ptid,
-				  DONT_INVALIDATE_CONTEXT);
+  windows_thread_info *th = windows_process->find_thread (thr->ptid);
   return th->thread_name ();
 }
 
@@ -2634,8 +2635,7 @@ windows_nat_target::thread_alive (ptid_t ptid)
 {
   gdb_assert (ptid.lwp () != 0);
 
-  windows_thread_info *th
-    = windows_process->thread_rec (ptid, DONT_INVALIDATE_CONTEXT);
+  windows_thread_info *th = windows_process->find_thread (ptid);
   return WaitForSingleObject (th->h, 0) != WAIT_OBJECT_0;
 }
 
diff --git a/gdb/windows-nat.h b/gdb/windows-nat.h
index 4368a29b2bb..10c144bf4c6 100644
--- a/gdb/windows-nat.h
+++ b/gdb/windows-nat.h
@@ -47,6 +47,7 @@ struct windows_solib
 
 struct windows_per_inferior : public windows_nat::windows_process_info
 {
+  windows_thread_info *find_thread (ptid_t ptid) override;
   windows_thread_info *thread_rec (ptid_t ptid,
 				   thread_disposition_type disposition) override;
   int handle_output_debug_string (struct target_waitstatus *ourstatus) override;
diff --git a/gdb/x86-windows-nat.c b/gdb/x86-windows-nat.c
index c7be192a894..5a82a2e0e36 100644
--- a/gdb/x86-windows-nat.c
+++ b/gdb/x86-windows-nat.c
@@ -307,8 +307,7 @@ cygwin_set_dr7 (unsigned long val)
 static CORE_ADDR
 cygwin_get_dr (int i)
 {
-  windows_thread_info *th
-    = windows_process->thread_rec (inferior_ptid, DONT_INVALIDATE_CONTEXT);
+  windows_thread_info *th = windows_process->find_thread (inferior_ptid);
 
   return windows_process->with_context (th, [&] (auto *context) -> CORE_ADDR
     {
@@ -443,7 +442,7 @@ display_selectors (const char * args, int from_tty)
     }
 
   windows_thread_info *current_windows_thread
-    = windows_process->thread_rec (inferior_ptid, DONT_INVALIDATE_CONTEXT);
+    = windows_process->find_thread (inferior_ptid);
 
   if (!args)
     {
diff --git a/gdbserver/win32-low.cc b/gdbserver/win32-low.cc
index adb4c08b980..d2b76b5d6c9 100644
--- a/gdbserver/win32-low.cc
+++ b/gdbserver/win32-low.cc
@@ -118,6 +118,17 @@ win32_require_context (windows_thread_info *th)
 
 /* See nat/windows-nat.h.  */
 
+windows_thread_info *
+gdbserver_windows_process::find_thread (ptid_t ptid)
+{
+  thread_info *thread = find_thread_ptid (ptid);
+  if (thread == nullptr)
+    return nullptr;
+  return static_cast<windows_thread_info *> (thread->target_data ());
+}
+
+/* See nat/windows-nat.h.  */
+
 windows_thread_info *
 gdbserver_windows_process::thread_rec
      (ptid_t ptid, thread_disposition_type disposition)
@@ -127,8 +138,7 @@ gdbserver_windows_process::thread_rec
     return NULL;
 
   auto th = static_cast<windows_thread_info *> (thread->target_data ());
-  if (disposition != DONT_INVALIDATE_CONTEXT)
-    win32_require_context (th);
+  win32_require_context (th);
   return th;
 }
 
@@ -139,7 +149,7 @@ child_add_thread (DWORD pid, DWORD tid, HANDLE h, void *tlb)
   windows_thread_info *th;
   ptid_t ptid = ptid_t (pid, tid, 0);
 
-  if ((th = windows_process.thread_rec (ptid, DONT_INVALIDATE_CONTEXT)))
+  if ((th = windows_process.find_thread (ptid)))
     return th;
 
   CORE_ADDR base = (CORE_ADDR) (uintptr_t) tlb;
@@ -787,7 +797,7 @@ win32_process_target::resume (thread_resume *resume_info, size_t n)
 
   /* Get context for the currently selected thread.  */
   ptid = debug_event_ptid (&windows_process.current_event);
-  th = windows_process.thread_rec (ptid, DONT_INVALIDATE_CONTEXT);
+  th = windows_process.find_thread (ptid);
   if (th)
     {
       win32_prepare_to_resume (th);
@@ -940,8 +950,7 @@ maybe_adjust_pc ()
   child_fetch_inferior_registers (regcache, -1);
 
   windows_thread_info *th
-    = windows_process.thread_rec (current_thread->id,
-				  DONT_INVALIDATE_CONTEXT);
+    = windows_process.find_thread (current_thread->id);
   th->stopped_at_software_breakpoint = false;
 
   if (windows_process.current_event.dwDebugEventCode == EXCEPTION_DEBUG_EVENT
@@ -1339,8 +1348,7 @@ win32_process_target::supports_get_tib_address ()
 int
 win32_process_target::get_tib_address (ptid_t ptid, CORE_ADDR *addr)
 {
-  windows_thread_info *th;
-  th = windows_process.thread_rec (ptid, DONT_INVALIDATE_CONTEXT);
+  windows_thread_info *th = windows_process.find_thread (ptid);
   if (th == NULL)
     return 0;
   if (addr != NULL)
@@ -1360,9 +1368,7 @@ win32_process_target::sw_breakpoint_from_kind (int kind, int *size)
 bool
 win32_process_target::stopped_by_sw_breakpoint ()
 {
-  windows_thread_info *th
-    = windows_process.thread_rec (current_thread->id,
-				  DONT_INVALIDATE_CONTEXT);
+  windows_thread_info *th = windows_process.find_thread (current_thread->id);
   return th == nullptr ? false : th->stopped_at_software_breakpoint;
 }
 
@@ -1387,9 +1393,7 @@ win32_process_target::write_pc (struct regcache *regcache, CORE_ADDR pc)
 const char *
 win32_process_target::thread_name (ptid_t thread)
 {
-  windows_thread_info *th
-    = windows_process.thread_rec (current_thread->id,
-				  DONT_INVALIDATE_CONTEXT);
+  windows_thread_info *th = windows_process.find_thread (current_thread->id);
   return th->thread_name ();
 }
 
diff --git a/gdbserver/win32-low.h b/gdbserver/win32-low.h
index 0259105ba11..edd7c757f09 100644
--- a/gdbserver/win32-low.h
+++ b/gdbserver/win32-low.h
@@ -178,6 +178,7 @@ public:
 
 struct gdbserver_windows_process : public windows_nat::windows_process_info
 {
+  windows_nat::windows_thread_info *find_thread (ptid_t ptid) override;
   windows_nat::windows_thread_info *thread_rec
        (ptid_t ptid,
 	windows_nat::thread_disposition_type disposition) override;
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.