Share some inferior-related Windows code
authorTom Tromey <tromey@adacore.com>
Wed, 8 Apr 2020 20:33:35 +0000 (14:33 -0600)
committerTom Tromey <tromey@adacore.com>
Wed, 8 Apr 2020 20:47:59 +0000 (14:47 -0600)
This adds a couple of functions to nat/windows-nat.c and changes gdb
and gdbserver to use them.  One function checks the list of pending
stops for a match (not yet used by gdbserver, but will be in a
subsequent patch); and the other is a wrapper for ContinueDebugEvent
that always uses the last "real" stop event.

gdb/ChangeLog
2020-04-08  Tom Tromey  <tromey@adacore.com>

* windows-nat.c (windows_continue): Use matching_pending_stop and
continue_last_debug_event.
* nat/windows-nat.h (matching_pending_stop)
(continue_last_debug_event): Declare.
* nat/windows-nat.c (DEBUG_EVENTS): New define.
(matching_pending_stop, continue_last_debug_event): New
functions.

gdbserver/ChangeLog
2020-04-08  Tom Tromey  <tromey@adacore.com>

* win32-low.c (child_continue): Call continue_last_debug_event.

gdb/ChangeLog
gdb/nat/windows-nat.c
gdb/nat/windows-nat.h
gdb/windows-nat.c
gdbserver/ChangeLog
gdbserver/win32-low.cc

index 663e2af7dc20b3225b1f21591c2cbff6550ba2df..3929faf089edfad4435f11ee96ca3fffa46112d0 100644 (file)
@@ -1,3 +1,13 @@
+2020-04-08  Tom Tromey  <tromey@adacore.com>
+
+       * windows-nat.c (windows_continue): Use matching_pending_stop and
+       continue_last_debug_event.
+       * nat/windows-nat.h (matching_pending_stop)
+       (continue_last_debug_event): Declare.
+       * nat/windows-nat.c (DEBUG_EVENTS): New define.
+       (matching_pending_stop, continue_last_debug_event): New
+       functions.
+
 2020-04-08  Tom Tromey  <tromey@adacore.com>
 
        * windows-nat.c (MS_VC_EXCEPTION): Move to nat/windows-nat.c.
index 6bbf41c7b131bce92eaeffa1d3a01afef0d5669b..2c2454b6f6f7768e86e9836d4ca5b2476e3ce7ec 100644 (file)
@@ -37,6 +37,10 @@ DWORD desired_stop_thread_id = -1;
 std::vector<pending_stop> pending_stops;
 EXCEPTION_RECORD siginfo_er;
 
+/* Note that 'debug_events' must be locally defined in the relevant
+   functions.  */
+#define DEBUG_EVENTS(x)        if (debug_events) debug_printf x
+
 windows_thread_info::~windows_thread_info ()
 {
   CloseHandle (h);
@@ -312,4 +316,46 @@ handle_exception (struct target_waitstatus *ourstatus, bool debug_exceptions)
 #undef DEBUG_EXCEPTION_SIMPLE
 }
 
+/* See nat/windows-nat.h.  */
+
+bool
+matching_pending_stop (bool debug_events)
+{
+  /* If there are pending stops, and we might plausibly hit one of
+     them, we don't want to actually continue the inferior -- we just
+     want to report the stop.  In this case, we just pretend to
+     continue.  See the comment by the definition of "pending_stops"
+     for details on why this is needed.  */
+  for (const auto &item : pending_stops)
+    {
+      if (desired_stop_thread_id == -1
+         || desired_stop_thread_id == item.thread_id)
+       {
+         DEBUG_EVENTS (("windows_continue - pending stop anticipated, "
+                        "desired=0x%x, item=0x%x\n",
+                        desired_stop_thread_id, item.thread_id));
+         return true;
+       }
+    }
+
+  return false;
+}
+
+/* See nat/windows-nat.h.  */
+
+BOOL
+continue_last_debug_event (DWORD continue_status, bool debug_events)
+{
+  DEBUG_EVENTS (("ContinueDebugEvent (cpid=%d, ctid=0x%x, %s);\n",
+                 (unsigned) last_wait_event.dwProcessId,
+                 (unsigned) last_wait_event.dwThreadId,
+                 continue_status == DBG_CONTINUE ?
+                 "DBG_CONTINUE" : "DBG_EXCEPTION_NOT_HANDLED"));
+
+  return ContinueDebugEvent (last_wait_event.dwProcessId,
+                            last_wait_event.dwThreadId,
+                            continue_status);
+}
+
+
 }
index a4e0b39fcab432e938f136faf88b8afc783466e5..0e9316577ba9efd267d6a075066c025f46bfc1e4 100644 (file)
@@ -225,6 +225,19 @@ typedef enum
 extern handle_exception_result handle_exception
   (struct target_waitstatus *ourstatus, bool debug_exceptions);
 
+/* Return true if there is a pending stop matching
+   desired_stop_thread_id.  If DEBUG_EVENTS is true, logging will be
+   enabled.  */
+
+extern bool matching_pending_stop (bool debug_events);
+
+/* A simple wrapper for ContinueDebugEvent that continues the last
+   waited-for event.  If DEBUG_EVENTS is true, logging will be
+   enabled.  */
+
+extern BOOL continue_last_debug_event (DWORD continue_status,
+                                      bool debug_events);
+
 }
 
 #endif
index d48f90a5c7afff0ef14da453373fa75f136f7187..d04dc06f3bf7cd7bfd31f0addff2827f0af05729 100644 (file)
@@ -1239,28 +1239,8 @@ windows_continue (DWORD continue_status, int id, int killed)
 
   desired_stop_thread_id = id;
 
-  /* If there are pending stops, and we might plausibly hit one of
-     them, we don't want to actually continue the inferior -- we just
-     want to report the stop.  In this case, we just pretend to
-     continue.  See the comment by the definition of "pending_stops"
-     for details on why this is needed.  */
-  for (const auto &item : pending_stops)
-    {
-      if (desired_stop_thread_id == -1
-         || desired_stop_thread_id == item.thread_id)
-       {
-         DEBUG_EVENTS (("windows_continue - pending stop anticipated, "
-                        "desired=0x%x, item=0x%x\n",
-                        desired_stop_thread_id, item.thread_id));
-         return TRUE;
-       }
-    }
-
-  DEBUG_EVENTS (("ContinueDebugEvent (cpid=%d, ctid=0x%x, %s);\n",
-                 (unsigned) last_wait_event.dwProcessId,
-                 (unsigned) last_wait_event.dwThreadId,
-                 continue_status == DBG_CONTINUE ?
-                 "DBG_CONTINUE" : "DBG_EXCEPTION_NOT_HANDLED"));
+  if (matching_pending_stop (debug_events))
+    return TRUE;
 
   for (windows_thread_info *th : thread_list)
     if (id == -1 || id == (int) th->tid)
@@ -1333,9 +1313,7 @@ windows_continue (DWORD continue_status, int id, int killed)
        th->suspend ();
       }
 
-  res = ContinueDebugEvent (last_wait_event.dwProcessId,
-                           last_wait_event.dwThreadId,
-                           continue_status);
+  res = continue_last_debug_event (continue_status, debug_events);
 
   if (!res)
     error (_("Failed to resume program execution"
index a00176aa4251aa3ac0f642513a6ece4a69eaa7ac..6793795376ea2b9ebc8af541fb8c50a677cc0a65 100644 (file)
@@ -1,3 +1,7 @@
+2020-04-08  Tom Tromey  <tromey@adacore.com>
+
+       * win32-low.c (child_continue): Call continue_last_debug_event.
+
 2020-04-08  Tom Tromey  <tromey@adacore.com>
 
        * win32-low.c (handle_exception): Remove.
index 7018083746ba479a6179a859b014908b0fa2a2fc..33f6470015376774c0ebe377ec1a6dcfe27fdf6f 100644 (file)
@@ -433,12 +433,7 @@ child_continue (DWORD continue_status, int thread_id)
     });
   faked_breakpoint = 0;
 
-  if (!ContinueDebugEvent (current_event.dwProcessId,
-                          current_event.dwThreadId,
-                          continue_status))
-    return FALSE;
-
-  return TRUE;
+  return continue_last_debug_event (continue_status, debug_threads);
 }
 
 /* Fetch register(s) from the current thread context.  */