[binutils-gdb] Windows gdb+gdbserver: Make last_sig per-thread state
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=1cccba5330495625de0268d4c4c87de284c85483 commit 1cccba5330495625de0268d4c4c87de284c85483 Author: Pedro Alves <[email protected]> Date: Mon May 22 19:09:13 2023 +0100 Windows gdb+gdbserver: Make last_sig per-thread state 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. Approved-By: Tom Tromey <[email protected]> Change-Id: Ie8c673a819be445753d967afd3a6084565648448 commit-id:d7dd0d0e Diff: --- gdb/nat/windows-nat.c | 8 +++++--- gdb/nat/windows-nat.h | 5 ++++- gdb/windows-nat.c | 10 +++------- gdbserver/win32-low.cc | 7 +++---- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/gdb/nat/windows-nat.c b/gdb/nat/windows-nat.c index 4adca4afa64..7eff99170fc 100644 --- a/gdb/nat/windows-nat.c +++ b/gdb/nat/windows-nat.c @@ -359,8 +359,6 @@ windows_process_info::handle_exception (DEBUG_EVENT ¤t_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 ¤t_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; diff --git a/gdb/nat/windows-nat.h b/gdb/nat/windows-nat.h index 4710ec39130..8555085c9f7 100644 --- a/gdb/nat/windows-nat.h +++ b/gdb/nat/windows-nat.h @@ -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 {}; diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c index 64c53b53934..b5e80139c26 100644 --- a/gdb/windows-nat.c +++ b/gdb/windows-nat.c @@ -712,6 +712,7 @@ windows_nat_target::continue_one_thread (windows_thread_info *th, bool killed = (cont_flags & WCONT_KILLED) != 0; thread_context_continue (th, killed); th->resume (); + th->last_sig = GDB_SIGNAL_0; } /* Resume thread specified by ID, or all artificially suspended @@ -812,7 +813,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 @@ -836,11 +837,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; - /* Get context for currently selected thread. */ if (step) { @@ -944,8 +943,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 (); @@ -1263,7 +1260,6 @@ windows_nat_target::do_initial_windows_stuff (DWORD pid, bool attaching) initialize_windows_arch (attaching); - windows_process->last_sig = GDB_SIGNAL_0; windows_process->open_process_used = 0; #ifdef __CYGWIN__ windows_process->cygwin_load_start = 0; diff --git a/gdbserver/win32-low.cc b/gdbserver/win32-low.cc index aa484fcda4a..5e09779082c 100644 --- a/gdbserver/win32-low.cc +++ b/gdbserver/win32-low.cc @@ -284,7 +284,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; @@ -385,6 +384,7 @@ continue_one_thread (thread_info *thread, int thread_id) } th->resume (); + th->last_sig = GDB_SIGNAL_0; } } } @@ -747,11 +747,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); @@ -944,7 +944,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;