]> 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, 19 May 2025 13:12:37 +0000 (14:12 +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 f86e6ae9a2838daa0c6ca82f70e30c14428f077c..1e518f46c4938d3bfd3ba950c5c6876f28036706 100644 (file)
@@ -1331,10 +1331,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;