]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Windows gdb: Can't pass signal to thread other than last stopped thread
authorPedro Alves <pedro@palves.net>
Thu, 11 May 2023 11:27:27 +0000 (12:27 +0100)
committerPedro Alves <pedro@palves.net>
Mon, 9 Jun 2025 17:09:14 +0000 (18:09 +0100)
Passing a signal to a thread other than the one that last reported an
event will be later possible with DBG_REPLY_LATER and the Windows
backend working in non-stop mode.

With an all-stop backend that isn't possible, so at least don't
incorrectly consider passing DBG_EXCEPTION_NOT_HANDLED if the thread
that we're going to call ContinueDebugEvent for is not the one that
the user issued "signal SIG" on.

Change-Id: I27092ecfbf0904ebce02dff07d9104d22f3d8f0e

gdb/windows-nat.c

index 51820f8efbc8e98b1dd1283e8e710f56e728bc6f..a08f6c6b7e87d2496b476466d65faca31bc78a5d 100644 (file)
@@ -1335,10 +1335,21 @@ windows_nat_target::resume (ptid_t ptid, int step, enum gdb_signal sig)
 
   if (sig != GDB_SIGNAL_0)
     {
-      if (windows_process.current_event.dwDebugEventCode
+      /* Note it is OK to call get_last_debug_event_ptid() from the
+        main thread here, because we know the process_thread thread
+        isn't waiting for an event at this point, so there's no data
+        race.  */
+      if (inferior_ptid != get_last_debug_event_ptid ())
+       {
+         /* ContinueDebugEvent will be for a different thread.  */
+         DEBUG_EXCEPT ("Cannot continue with signal %d here.  "
+                       "Not last-event thread", sig);
+       }
+      else if (windows_process.current_event.dwDebugEventCode
          != EXCEPTION_DEBUG_EVENT)
        {
-         DEBUG_EXCEPT ("Cannot continue with signal %d here.", sig);
+         DEBUG_EXCEPT ("Cannot continue with signal %d here.  "
+                       "Not stopped for EXCEPTION_DEBUG_EVENT", sig);
        }
       else if (sig == windows_process.last_sig)
        continue_status = DBG_EXCEPTION_NOT_HANDLED;