[binutils-gdb] Windows gdb: Introduce continue_last_debug_event_main_thread

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=e476c9ab2583547786134619590348ea82207879

commit e476c9ab2583547786134619590348ea82207879
Author: Pedro Alves <[email protected]>
Date:   Thu Oct 21 18:16:58 2021 +0100

    Windows gdb: Introduce continue_last_debug_event_main_thread
    
    We have code using do_synchronously to call continue_last_debug_event,
    and later patches in the series would need to add the same code in few
    more places.  Factor it out to a continue_last_debug_event_main_thread
    function so these other places in future patches can just call it.
    
    Approved-By: Tom Tromey <[email protected]>
    Change-Id: I945e668d2b3daeb9de968219925a7b3c7c7ce9ed
    commit-id:ee04461a

Diff:
---
 gdb/windows-nat.c | 43 ++++++++++++++++++++++++++-----------------
 gdb/windows-nat.h |  6 ++++++
 2 files changed, 32 insertions(+), 17 deletions(-)

diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c
index 468f451595d..174b54eda78 100644
--- a/gdb/windows-nat.c
+++ b/gdb/windows-nat.c
@@ -261,6 +261,28 @@ windows_nat_target::wait_for_debug_event_main_thread (DEBUG_EVENT *event)
   m_continued = false;
 }
 
+void
+windows_nat_target::continue_last_debug_event_main_thread
+  (const char *context_str, DWORD continue_status, bool last_call)
+{
+  std::optional<unsigned> err;
+  do_synchronously ([&] ()
+    {
+      if (!continue_last_debug_event (continue_status, debug_events))
+	err = (unsigned) GetLastError ();
+
+      /* On the last call, do not block waiting for an event that will
+	 never come.  */
+      return !last_call;
+    });
+  if (err.has_value ())
+    throw_winerror_with_name (string_printf (_("ContinueDebugEvent failed: %s"),
+					     context_str).c_str (),
+			      *err);
+
+  m_continued = !last_call;
+}
+
 /* See nat/windows-nat.h.  */
 
 windows_thread_info *
@@ -711,22 +733,9 @@ windows_nat_target::windows_continue (DWORD continue_status, int id,
 	th->resume ();
       }
 
-  std::optional<unsigned> err;
-  do_synchronously ([&] ()
-    {
-      if (!continue_last_debug_event (continue_status, debug_events))
-	err = (unsigned) GetLastError ();
-      /* On the last call, do not block waiting for an event that will
-	 never come.  */
-      return !last_call;
-    });
-
-  if (err.has_value ())
-    throw_winerror_with_name (_("Failed to resume program execution"
-				" - ContinueDebugEvent failed"),
-			      *err);
-
-  m_continued = !last_call;
+  continue_last_debug_event_main_thread
+    (_("Failed to resume program execution"), continue_status,
+     last_call);
 
   return TRUE;
 }
@@ -1188,7 +1197,7 @@ windows_nat_target::wait (ptid_t ptid, struct target_waitstatus *ourstatus,
 
 	      /* All-stop, suspend all threads until they are
 		 explicitly resumed.  */
-	      for (auto &thr : windows_process.thread_list)
+	      for (auto &thr : windows_process->thread_list)
 		thr->suspend ();
 	    }
 
diff --git a/gdb/windows-nat.h b/gdb/windows-nat.h
index 2907d97d655..8866408567c 100644
--- a/gdb/windows-nat.h
+++ b/gdb/windows-nat.h
@@ -249,6 +249,12 @@ private:
      needed.  */
   void wait_for_debug_event_main_thread (DEBUG_EVENT *event);
 
+  /* This continues the last debug event, dispatching to the worker
+     thread as needed.  */
+  void continue_last_debug_event_main_thread (const char *context_str,
+					      DWORD continue_status,
+					      bool last_call = false);
+
   /* Force the process_thread thread to return from WaitForDebugEvent.
      PROCESS_ALIVE is set to false if the inferior process exits while
      we're trying to break out the process_thread thread.  This can
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.