From: "Tom Tromey (Code Review)" <gerrit@gnutoolchain-gerrit.osci.io>
To: gdb-patches@sourceware.org
Subject: [review] Share thread_rec between gdb and gdbserver
Date: Tue, 26 Nov 2019 17:12:00 -0000 [thread overview]
Message-ID: <gerrit.1574788288000.I128a36466e0774fe2beca1c63a6675bd91ff7b26@gnutoolchain-gerrit.osci.io> (raw)
In-Reply-To: <gerrit.1574788288000.I128a36466e0774fe2beca1c63a6675bd91ff7b26@gnutoolchain-gerrit.osci.io>
Change URL: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/708
......................................................................
Share thread_rec between gdb and gdbserver
This changes gdb and gdbserver to use the same calling convention for
the "thread_rec" helper function. Fully merging these is difficult
due to differences in how threads are managed by the enclosing
applications; but sharing a declaration makes it possible for future
shared code to call this method.
gdb/ChangeLog
2019-11-26 Tom Tromey <tromey@adacore.com>
* windows-nat.c (enum thread_disposition_type): Move to
nat/windows-nat.h.
(windows_nat::thread_rec): Rename from thread_rec. No longer
static.
(windows_add_thread, windows_nat_target::fetch_registers)
(windows_nat_target::store_registers, handle_exception)
(windows_nat_target::resume, get_windows_debug_event)
(windows_nat_target::get_tib_address)
(windows_nat_target::thread_name)
(windows_nat_target::thread_alive): Update.
* nat/windows-nat.h (enum thread_disposition_type): Move from
windows-nat.c.
(thread_rec): Declare.
gdb/gdbserver/ChangeLog
2019-11-26 Tom Tromey <tromey@adacore.com>
* win32-low.c (windows_nat::thread_rec): Rename from thread_rec.
No longer static. Change parameters.
(child_add_thread, child_fetch_inferior_registers)
(child_store_inferior_registers, win32_resume)
(win32_get_tib_address): Update.
Change-Id: I128a36466e0774fe2beca1c63a6675bd91ff7b26
---
M gdb/ChangeLog
M gdb/gdbserver/ChangeLog
M gdb/gdbserver/win32-low.c
M gdb/nat/windows-nat.h
M gdb/windows-nat.c
5 files changed, 79 insertions(+), 49 deletions(-)
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index a613484..0a6e4b8 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,21 @@
2019-11-26 Tom Tromey <tromey@adacore.com>
+ * windows-nat.c (enum thread_disposition_type): Move to
+ nat/windows-nat.h.
+ (windows_nat::thread_rec): Rename from thread_rec. No longer
+ static.
+ (windows_add_thread, windows_nat_target::fetch_registers)
+ (windows_nat_target::store_registers, handle_exception)
+ (windows_nat_target::resume, get_windows_debug_event)
+ (windows_nat_target::get_tib_address)
+ (windows_nat_target::thread_name)
+ (windows_nat_target::thread_alive): Update.
+ * nat/windows-nat.h (enum thread_disposition_type): Move from
+ windows-nat.c.
+ (thread_rec): Declare.
+
+2019-11-26 Tom Tromey <tromey@adacore.com>
+
* windows-nat.c: Add "using namespace".
* nat/windows-nat.h: Wrap contents in windows_nat namespace.
* nat/windows-nat.c: Wrap contents in windows_nat namespace.
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog
index 03fcd87..4e703b8 100644
--- a/gdb/gdbserver/ChangeLog
+++ b/gdb/gdbserver/ChangeLog
@@ -1,5 +1,13 @@
2019-11-26 Tom Tromey <tromey@adacore.com>
+ * win32-low.c (windows_nat::thread_rec): Rename from thread_rec.
+ No longer static. Change parameters.
+ (child_add_thread, child_fetch_inferior_registers)
+ (child_store_inferior_registers, win32_resume)
+ (win32_get_tib_address): Update.
+
+2019-11-26 Tom Tromey <tromey@adacore.com>
+
* win32-low.h: Add "using namespace".
2019-11-26 Tom Tromey <tromey@adacore.com>
diff --git a/gdb/gdbserver/win32-low.c b/gdb/gdbserver/win32-low.c
index 9d69af7..c4e6cd2 100644
--- a/gdb/gdbserver/win32-low.c
+++ b/gdb/gdbserver/win32-low.c
@@ -177,17 +177,17 @@
}
}
-/* Find a thread record given a thread id. If GET_CONTEXT is set then
- also retrieve the context for this thread. */
-static windows_thread_info *
-thread_rec (ptid_t ptid, int get_context)
+/* See nat/windows-nat.h. */
+
+windows_thread_info *
+windows_nat::thread_rec (ptid_t ptid, thread_disposition_type disposition)
{
thread_info *thread = find_thread_ptid (ptid);
if (thread == NULL)
return NULL;
windows_thread_info *th = (windows_thread_info *) thread_target_data (thread);
- if (get_context)
+ if (disposition != DONT_INVALIDATE_CONTEXT)
win32_require_context (th);
return th;
}
@@ -199,7 +199,7 @@
windows_thread_info *th;
ptid_t ptid = ptid_t (pid, tid, 0);
- if ((th = thread_rec (ptid, FALSE)))
+ if ((th = thread_rec (ptid, DONT_INVALIDATE_CONTEXT)))
return th;
th = new windows_thread_info (tid, h, (CORE_ADDR) (uintptr_t) tlb);
@@ -453,7 +453,8 @@
child_fetch_inferior_registers (struct regcache *regcache, int r)
{
int regno;
- windows_thread_info *th = thread_rec (current_thread_ptid (), TRUE);
+ windows_thread_info *th = thread_rec (current_thread_ptid (),
+ INVALIDATE_CONTEXT);
if (r == -1 || r > NUM_REGS)
child_fetch_inferior_registers (regcache, NUM_REGS);
else
@@ -467,7 +468,8 @@
child_store_inferior_registers (struct regcache *regcache, int r)
{
int regno;
- windows_thread_info *th = thread_rec (current_thread_ptid (), TRUE);
+ windows_thread_info *th = thread_rec (current_thread_ptid (),
+ INVALIDATE_CONTEXT);
if (r == -1 || r == 0 || r > NUM_REGS)
child_store_inferior_registers (regcache, NUM_REGS);
else
@@ -924,7 +926,7 @@
/* Get context for the currently selected thread. */
ptid = debug_event_ptid (¤t_event);
- th = thread_rec (ptid, FALSE);
+ th = thread_rec (ptid, DONT_INVALIDATE_CONTEXT);
if (th)
{
win32_prepare_to_resume (th);
@@ -1729,7 +1731,7 @@
win32_get_tib_address (ptid_t ptid, CORE_ADDR *addr)
{
windows_thread_info *th;
- th = thread_rec (ptid, 0);
+ th = thread_rec (ptid, DONT_INVALIDATE_CONTEXT);
if (th == NULL)
return 0;
if (addr != NULL)
diff --git a/gdb/nat/windows-nat.h b/gdb/nat/windows-nat.h
index 2f9b181..e6eebee 100644
--- a/gdb/nat/windows-nat.h
+++ b/gdb/nat/windows-nat.h
@@ -84,6 +84,27 @@
gdb::unique_xmalloc_ptr<char> name;
};
+
+/* 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. */
+ INVALIDATE_CONTEXT
+};
+
+/* Find a thread record given a thread id. THREAD_DISPOSITION
+ controls whether the thread is suspended, and whether the context
+ is invalidated.
+
+ This function must be supplied by the embedding application. */
+extern windows_thread_info *thread_rec (ptid_t ptid,
+ thread_disposition_type disposition);
+
}
#endif
diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c
index 198bb5a..935d682 100644
--- a/gdb/windows-nat.c
+++ b/gdb/windows-nat.c
@@ -417,26 +417,13 @@
(unsigned) GetLastError ());
}
-/* 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. */
- INVALIDATE_CONTEXT
-};
+/* See nat/windows-nat.h. */
-/* Find a thread record given a thread id. THREAD_DISPOSITION
- controls whether the thread is suspended, and whether the context
- is invalidated. */
-static windows_thread_info *
-thread_rec (DWORD id, enum thread_disposition_type disposition)
+windows_thread_info *
+windows_nat::thread_rec (ptid_t ptid, thread_disposition_type disposition)
{
for (windows_thread_info *th : thread_list)
- if (th->tid == id)
+ if (th->tid == ptid.lwp ())
{
if (!th->suspended)
{
@@ -446,7 +433,7 @@
/* Nothing. */
break;
case INVALIDATE_CONTEXT:
- if (id != current_event.dwThreadId)
+ if (ptid.lwp () != current_event.dwThreadId)
th->suspend ();
th->reload_context = true;
break;
@@ -474,16 +461,13 @@
windows_add_thread (ptid_t ptid, HANDLE h, void *tlb, bool main_thread_p)
{
windows_thread_info *th;
- DWORD id;
gdb_assert (ptid.lwp () != 0);
- id = ptid.lwp ();
-
- if ((th = thread_rec (id, DONT_INVALIDATE_CONTEXT)))
+ if ((th = thread_rec (ptid, DONT_INVALIDATE_CONTEXT)))
return th;
- th = new windows_thread_info (id, h, (CORE_ADDR) (uintptr_t) tlb);
+ th = new windows_thread_info (ptid.lwp (), h, (CORE_ADDR) (uintptr_t) tlb);
thread_list.push_back (th);
/* Add this new thread to the list of threads.
@@ -644,8 +628,7 @@
void
windows_nat_target::fetch_registers (struct regcache *regcache, int r)
{
- DWORD tid = regcache->ptid ().lwp ();
- windows_thread_info *th = thread_rec (tid, INVALIDATE_CONTEXT);
+ windows_thread_info *th = thread_rec (regcache->ptid (), INVALIDATE_CONTEXT);
/* Check if TH exists. Windows sometimes uses a non-existent
thread id in its events. */
@@ -714,8 +697,7 @@
void
windows_nat_target::store_registers (struct regcache *regcache, int r)
{
- DWORD tid = regcache->ptid ().lwp ();
- windows_thread_info *th = thread_rec (tid, INVALIDATE_CONTEXT);
+ windows_thread_info *th = thread_rec (regcache->ptid (), INVALIDATE_CONTEXT);
/* Check if TH exists. Windows sometimes uses a non-existent
thread id in its events. */
@@ -1213,7 +1195,8 @@
ourstatus->kind = TARGET_WAITKIND_STOPPED;
/* Record the context of the current thread. */
- thread_rec (current_event.dwThreadId, DONT_SUSPEND);
+ thread_rec (ptid_t (current_event.dwProcessId, current_event.dwThreadId, 0),
+ DONT_SUSPEND);
switch (code)
{
@@ -1329,7 +1312,9 @@
if (named_thread_id == (DWORD) -1)
named_thread_id = current_event.dwThreadId;
- named_thread = thread_rec (named_thread_id, DONT_INVALIDATE_CONTEXT);
+ named_thread = thread_rec (ptid_t (current_event.dwProcessId,
+ named_thread_id, 0),
+ DONT_INVALIDATE_CONTEXT);
if (named_thread != NULL)
{
int thread_name_len;
@@ -1527,7 +1512,7 @@
ptid.pid (), (unsigned) ptid.lwp (), step, sig));
/* Get context for currently selected thread. */
- th = thread_rec (inferior_ptid.lwp (), DONT_INVALIDATE_CONTEXT);
+ th = thread_rec (inferior_ptid, DONT_INVALIDATE_CONTEXT);
if (th)
{
if (step)
@@ -1628,7 +1613,7 @@
current_event = iter->event;
inferior_ptid = ptid_t (current_event.dwProcessId, thread_id, 0);
- current_thread = thread_rec (thread_id, INVALIDATE_CONTEXT);
+ current_thread = thread_rec (inferior_ptid, INVALIDATE_CONTEXT);
current_thread->reload_context = 1;
DEBUG_EVENTS (("get_windows_debug_event - "
@@ -1827,7 +1812,8 @@
== EXCEPTION_BREAKPOINT)
&& windows_initialization_done)
{
- th = thread_rec (thread_id, INVALIDATE_CONTEXT);
+ ptid_t ptid = ptid_t (current_event.dwProcessId, thread_id, 0);
+ th = thread_rec (ptid, INVALIDATE_CONTEXT);
th->stopped_at_breakpoint = true;
}
pending_stops.push_back ({thread_id, *ourstatus, current_event});
@@ -1839,7 +1825,7 @@
inferior_ptid = ptid_t (current_event.dwProcessId, thread_id, 0);
current_thread = th;
if (!current_thread)
- current_thread = thread_rec (thread_id, INVALIDATE_CONTEXT);
+ current_thread = thread_rec (inferior_ptid, INVALIDATE_CONTEXT);
}
out:
@@ -3154,7 +3140,7 @@
{
windows_thread_info *th;
- th = thread_rec (ptid.lwp (), DONT_INVALIDATE_CONTEXT);
+ th = thread_rec (ptid, DONT_INVALIDATE_CONTEXT);
if (th == NULL)
return false;
@@ -3175,7 +3161,7 @@
const char *
windows_nat_target::thread_name (struct thread_info *thr)
{
- return thread_rec (thr->ptid.lwp (), DONT_INVALIDATE_CONTEXT)->name.get ();
+ return thread_rec (thr->ptid, DONT_INVALIDATE_CONTEXT)->name.get ();
}
@@ -3333,12 +3319,9 @@
bool
windows_nat_target::thread_alive (ptid_t ptid)
{
- int tid;
-
gdb_assert (ptid.lwp () != 0);
- tid = ptid.lwp ();
- return (WaitForSingleObject (thread_rec (tid, DONT_INVALIDATE_CONTEXT)->h, 0)
+ return (WaitForSingleObject (thread_rec (ptid, DONT_INVALIDATE_CONTEXT)->h, 0)
!= WAIT_OBJECT_0);
}
--
Gerrit-Project: binutils-gdb
Gerrit-Branch: master
Gerrit-Change-Id: I128a36466e0774fe2beca1c63a6675bd91ff7b26
Gerrit-Change-Number: 708
Gerrit-PatchSet: 1
Gerrit-Owner: Tom Tromey <tromey@sourceware.org>
Gerrit-MessageType: newchange
next parent reply other threads:[~2019-11-26 17:12 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-11-26 17:12 Tom Tromey (Code Review) [this message]
2019-11-29 19:13 ` Pedro Alves (Code Review)
-- strict thread matches above, loose matches on Subject: below --
2019-10-29 17:58 Tom Tromey (Code Review)
2019-11-26 23:35 ` Luis Machado (Code Review)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=gerrit.1574788288000.I128a36466e0774fe2beca1c63a6675bd91ff7b26@gnutoolchain-gerrit.osci.io \
--to=gerrit@gnutoolchain-gerrit.osci.io \
--cc=gdb-patches@sourceware.org \
--cc=tromey@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).