]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Windows gdb+gdbserver: Make last_sig per-thread state
authorPedro Alves <pedro@palves.net>
Mon, 22 May 2023 18:09:13 +0000 (19:09 +0100)
committerPedro Alves <pedro@palves.net>
Mon, 9 Jun 2025 17:09:14 +0000 (18:09 +0100)
With non-stop mode, each thread is controlled independently of the
others, and each thread has its own independent reason for its last
stop.

Thus, any thread-specific state that is currently per-process must be
converted to per-thread state.

This patch converts windows_process_info::last_sig to per-thread
state, moving it to windows_thread_info instead.

This adjusts both native gdb and gdbserver.

Change-Id: Ie8c673a819be445753d967afd3a6084565648448

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

index 53d891f65d0635654e87fdc38af40cc32a602e02..864788ec1256478f2ac9da97334428e56b850c3e 100644 (file)
@@ -359,8 +359,6 @@ windows_process_info::handle_exception (DEBUG_EVENT &current_event,
 
   memcpy (&siginfo_er, rec, sizeof siginfo_er);
 
-  last_sig = GDB_SIGNAL_0;
-
   switch (code)
     {
     case EXCEPTION_ACCESS_VIOLATION:
@@ -494,7 +492,11 @@ windows_process_info::handle_exception (DEBUG_EVENT &current_event,
     }
 
   if (ourstatus->kind () == TARGET_WAITKIND_STOPPED)
-    last_sig = ourstatus->sig ();
+    {
+      ptid_t ptid (current_event.dwProcessId, current_event.dwThreadId, 0);
+      windows_thread_info *th = find_thread (ptid);
+      th->last_sig = ourstatus->sig ();
+    }
 
   return result;
 
index 0b89c751e898795d51093e8c245ab0b0cad5c383..71cb118f5d6607dc080b41e1cc4d725509a0c657 100644 (file)
@@ -104,6 +104,10 @@ struct windows_thread_info
      thread.  */
   DEBUG_EVENT last_event {};
 
+  /* The last signal reported for this thread, extracted out of
+     last_event.  */
+  enum gdb_signal last_sig = GDB_SIGNAL_0;
+
   /* The context of the thread, including any manipulations.  */
   union
   {
@@ -147,7 +151,6 @@ struct windows_process_info
   HANDLE handle = 0;
   DWORD process_id = 0;
   DWORD main_thread_id = 0;
-  enum gdb_signal last_sig = GDB_SIGNAL_0;
 
   /* Contents of $_siginfo */
   EXCEPTION_RECORD siginfo_er {};
index 067c3f8db39a27d9bb7819d26e48f31136b436a9..47a157ed295d5e661b390fa5a465fb0ef7de5173 100644 (file)
@@ -1262,6 +1262,7 @@ windows_per_inferior::continue_one_thread (windows_thread_info *th,
     });
 
   th->resume ();
+  th->last_sig = GDB_SIGNAL_0;
 }
 
 /* Resume thread specified by ID, or all artificially suspended
@@ -1362,7 +1363,7 @@ windows_nat_target::resume (ptid_t ptid, int step, enum gdb_signal sig)
          DEBUG_EXCEPT ("Cannot continue with signal %d here.  "
                        "Not stopped for EXCEPTION_DEBUG_EVENT", sig);
        }
-      else if (sig == windows_process.last_sig)
+      else if (sig == th->last_sig)
        continue_status = DBG_EXCEPTION_NOT_HANDLED;
       else
 #if 0
@@ -1386,11 +1387,9 @@ windows_nat_target::resume (ptid_t ptid, int step, enum gdb_signal sig)
        }
 #endif
       DEBUG_EXCEPT ("Can only continue with received signal %d.",
-                   windows_process.last_sig);
+                   th->last_sig);
     }
 
-  windows_process.last_sig = GDB_SIGNAL_0;
-
   windows_process.with_context (th, [&] (auto *context)
     {
       if (step)
@@ -1490,8 +1489,6 @@ windows_nat_target::get_windows_debug_event
        }
     }
 
-  windows_process.last_sig = GDB_SIGNAL_0;
-
   if ((options & TARGET_WNOHANG) != 0 && !m_debug_event_pending)
     {
       ourstatus->set_ignore ();
@@ -1810,7 +1807,6 @@ windows_nat_target::do_initial_windows_stuff (DWORD pid, bool attaching)
 {
   struct inferior *inf;
 
-  windows_process.last_sig = GDB_SIGNAL_0;
   windows_process.open_process_used = 0;
 #ifdef __CYGWIN__
   windows_process.cygwin_load_start = 0;
index a4000980f67b2221ebbe141a01a8f4522f323c96..c3e35a6f60290b0685497d71a1d6234f586db9f5 100644 (file)
@@ -289,7 +289,6 @@ do_initial_child_stuff (HANDLE proch, DWORD pid, int attached)
 {
   struct process_info *proc;
 
-  windows_process.last_sig = GDB_SIGNAL_0;
   windows_process.handle = proch;
   windows_process.process_id = pid;
   windows_process.main_thread_id = 0;
@@ -396,6 +395,7 @@ continue_one_thread (thread_info *thread, int thread_id)
            }
 
          th->resume ();
+         th->last_sig = GDB_SIGNAL_0;
        }
     }
 }
@@ -758,11 +758,11 @@ resume_one_thread (thread_info *thread, bool step, gdb_signal sig,
                   "Not stopped for EXCEPTION_DEBUG_EVENT.\n",
                   gdb_signal_to_string (sig)));
        }
-      else if (sig == windows_process.last_sig)
+      else if (sig == th->last_sig)
        *continue_status = DBG_EXCEPTION_NOT_HANDLED;
       else
        OUTMSG (("Can only continue with received signal %s.\n",
-                gdb_signal_to_string (windows_process.last_sig)));
+                gdb_signal_to_string (th->last_sig)));
     }
 
   win32_prepare_to_resume (th);
@@ -957,7 +957,6 @@ get_child_debug_event (DWORD *continue_status,
 {
   ptid_t ptid;
 
-  windows_process.last_sig = GDB_SIGNAL_0;
   ourstatus->set_spurious ();
   *continue_status = DBG_CONTINUE;