diff options
author | Pedro Alves <pedro@palves.net> | 2023-05-08 17:09:58 +0100 |
---|---|---|
committer | Pedro Alves <pedro@palves.net> | 2024-05-08 00:39:55 +0100 |
commit | 446babcd70ae2fb4fd3ef2f83efba4b74c38b170 (patch) | |
tree | c3b879e380d82455a0bbb9a86edf0ce06f0aa96a /gdb | |
parent | cefdca26f9579f49757827a8271fb8cd74a3f60a (diff) | |
download | binutils-446babcd70ae2fb4fd3ef2f83efba4b74c38b170.zip binutils-446babcd70ae2fb4fd3ef2f83efba4b74c38b170.tar.gz binutils-446babcd70ae2fb4fd3ef2f83efba4b74c38b170.tar.bz2 |
Windows gdb+gdbserver: New find_thread, replaces thread_rec(DONT_INVALIDATE_CONTEXT)
The goal of the next few patches is to eliminate thread_rec
completely. This is the first patch in that effort.
thread_rec(DONT_INVALIDATE_CONTEXT) is really just a thread lookup
with no side effects, so this adds a find_thread function that lets
you do that.
Change-Id: Ie486badce00e234b10caa478b066c34537103e3f
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/nat/windows-nat.c | 5 | ||||
-rw-r--r-- | gdb/nat/windows-nat.h | 7 | ||||
-rw-r--r-- | gdb/windows-nat.c | 72 |
3 files changed, 41 insertions, 43 deletions
diff --git a/gdb/nat/windows-nat.c b/gdb/nat/windows-nat.c index f9f6848..46fbc2b 100644 --- a/gdb/nat/windows-nat.c +++ b/gdb/nat/windows-nat.c @@ -325,9 +325,8 @@ windows_process_info::handle_ms_vc_exception (const EXCEPTION_RECORD *rec) if (named_thread_id == (DWORD) -1) named_thread_id = current_event.dwThreadId; - named_thread = thread_rec (ptid_t (current_event.dwProcessId, - named_thread_id, 0), - DONT_INVALIDATE_CONTEXT); + named_thread = find_thread (ptid_t (current_event.dwProcessId, + named_thread_id, 0)); if (named_thread != NULL) { int thread_name_len; diff --git a/gdb/nat/windows-nat.h b/gdb/nat/windows-nat.h index 3783f39..9e8c87e 100644 --- a/gdb/nat/windows-nat.h +++ b/gdb/nat/windows-nat.h @@ -105,9 +105,6 @@ struct windows_thread_info /* Possible values to pass to 'thread_rec'. */ enum thread_disposition_type { - /* Do not invalidate the thread's context, and do not suspend the - thread. */ - DONT_INVALIDATE_CONTEXT, /* Invalidate the context, but do not suspend the thread. */ DONT_SUSPEND, /* Invalidate the context and suspend the thread. */ @@ -178,6 +175,10 @@ struct windows_process_info bool ignore_first_breakpoint = false; #endif + /* Find a thread record given a thread id. + + This function must be supplied by the embedding application. */ + virtual windows_thread_info *find_thread (ptid_t ptid) = 0; /* Find a thread record given a thread id. THREAD_DISPOSITION controls whether the thread is suspended, and whether the context diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c index 0102511..3a3dad5 100644 --- a/gdb/windows-nat.c +++ b/gdb/windows-nat.c @@ -90,6 +90,7 @@ struct windows_solib struct windows_per_inferior : public windows_process_info { + windows_thread_info *find_thread (ptid_t ptid) override; windows_thread_info *thread_rec (ptid_t ptid, thread_disposition_type disposition) override; int handle_output_debug_string (struct target_waitstatus *ourstatus) override; @@ -257,8 +258,7 @@ struct windows_nat_target final : public x86_nat_target<inf_child_target> bool stopped_by_sw_breakpoint () override { - windows_thread_info *th - = windows_process.thread_rec (inferior_ptid, DONT_INVALIDATE_CONTEXT); + windows_thread_info *th = windows_process.find_thread (inferior_ptid); return th->stopped_at_software_breakpoint; } @@ -515,34 +515,36 @@ windows_nat_target::wait_for_debug_event_main_thread (DEBUG_EVENT *event) /* See nat/windows-nat.h. */ windows_thread_info * -windows_per_inferior::thread_rec - (ptid_t ptid, thread_disposition_type disposition) +windows_per_inferior::find_thread (ptid_t ptid) { for (auto &th : thread_list) if (th->tid == ptid.lwp ()) - { - if (!th->suspended) - { - switch (disposition) - { - case DONT_INVALIDATE_CONTEXT: - /* Nothing. */ - break; - case INVALIDATE_CONTEXT: - if (ptid.lwp () != current_event.dwThreadId) - th->suspend (); - th->reload_context = true; - break; - case DONT_SUSPEND: - th->reload_context = true; - th->suspended = -1; - break; - } - } - return th.get (); - } + return th.get (); + return nullptr; +} - return NULL; +windows_thread_info * +windows_per_inferior::thread_rec + (ptid_t ptid, thread_disposition_type disposition) +{ + windows_thread_info *th = find_thread (ptid); + + if (th != nullptr && !th->suspended) + { + switch (disposition) + { + case INVALIDATE_CONTEXT: + if (ptid.lwp () != current_event.dwThreadId) + th->suspend (); + th->reload_context = true; + break; + case DONT_SUSPEND: + th->reload_context = true; + th->suspended = -1; + break; + } + } + return th; } /* Add a thread to the thread list. @@ -561,7 +563,7 @@ windows_nat_target::add_thread (ptid_t ptid, HANDLE h, void *tlb, gdb_assert (ptid.lwp () != 0); - if ((th = windows_process.thread_rec (ptid, DONT_INVALIDATE_CONTEXT))) + if ((th = windows_process.find_thread (ptid))) return th; CORE_ADDR base = (CORE_ADDR) (uintptr_t) tlb; @@ -1149,7 +1151,7 @@ display_selectors (const char * args, int from_tty) } windows_thread_info *current_windows_thread - = windows_process.thread_rec (inferior_ptid, DONT_INVALIDATE_CONTEXT); + = windows_process.find_thread (inferior_ptid); if (!args) { @@ -1426,7 +1428,7 @@ windows_nat_target::resume (ptid_t ptid, int step, enum gdb_signal sig) ptid.pid (), (unsigned) ptid.lwp (), step, sig); /* Get context for currently selected thread. */ - th = windows_process.thread_rec (inferior_ptid, DONT_INVALIDATE_CONTEXT); + th = windows_process.find_thread (inferior_ptid); if (th) { #ifdef __x86_64__ @@ -3119,7 +3121,7 @@ windows_nat_target::get_tib_address (ptid_t ptid, CORE_ADDR *addr) { windows_thread_info *th; - th = windows_process.thread_rec (ptid, DONT_INVALIDATE_CONTEXT); + th = windows_process.find_thread (ptid); if (th == NULL) return false; @@ -3140,9 +3142,7 @@ windows_nat_target::get_ada_task_ptid (long lwp, ULONGEST thread) const char * windows_nat_target::thread_name (struct thread_info *thr) { - windows_thread_info *th - = windows_process.thread_rec (thr->ptid, - DONT_INVALIDATE_CONTEXT); + windows_thread_info *th = windows_process.find_thread (thr->ptid); return th->thread_name (); } @@ -3282,8 +3282,7 @@ cygwin_set_dr7 (unsigned long val) static CORE_ADDR cygwin_get_dr (int i) { - windows_thread_info *th - = windows_process.thread_rec (inferior_ptid, DONT_INVALIDATE_CONTEXT); + windows_thread_info *th = windows_process.find_thread (inferior_ptid); #ifdef __x86_64__ if (windows_process.wow64_process) @@ -3356,8 +3355,7 @@ windows_nat_target::thread_alive (ptid_t ptid) { gdb_assert (ptid.lwp () != 0); - windows_thread_info *th - = windows_process.thread_rec (ptid, DONT_INVALIDATE_CONTEXT); + windows_thread_info *th = windows_process.find_thread (ptid); return WaitForSingleObject (th->h, 0) != WAIT_OBJECT_0; } |