* linux-nat.c (linux_nat_thread_address_space): New.

(linux_nat_add_target): Install it.
	* progspace.c (address_space_num): New.
	* progspace.h (address_space_num): Declare.
	* target.c (target_thread_address_space): Really query the target.
	* target.h (struct target_ops) <to_thread_address_space>: New
	field.
This commit is contained in:
Pedro Alves
2009-10-20 11:09:01 +00:00
parent dbde1c1272
commit c069425482
6 changed files with 77 additions and 2 deletions

View File

@@ -5311,6 +5311,39 @@ linux_nat_close (int quitting)
linux_ops->to_close (quitting);
}
/* When requests are passed down from the linux-nat layer to the
single threaded inf-ptrace layer, ptids of (lwpid,0,0) form are
used. The address space pointer is stored in the inferior object,
but the common code that is passed such ptid can't tell whether
lwpid is a "main" process id or not (it assumes so). We reverse
look up the "main" process id from the lwp here. */
struct address_space *
linux_nat_thread_address_space (struct target_ops *t, ptid_t ptid)
{
struct lwp_info *lwp;
struct inferior *inf;
int pid;
pid = GET_LWP (ptid);
if (GET_LWP (ptid) == 0)
{
/* An (lwpid,0,0) ptid. Look up the lwp object to get at the
tgid. */
lwp = find_lwp_pid (ptid);
pid = GET_PID (lwp->ptid);
}
else
{
/* A (pid,lwpid,0) ptid. */
pid = GET_PID (ptid);
}
inf = find_inferior_pid (pid);
gdb_assert (inf != NULL);
return inf->aspace;
}
void
linux_nat_add_target (struct target_ops *t)
{
@@ -5333,6 +5366,7 @@ linux_nat_add_target (struct target_ops *t)
t->to_thread_alive = linux_nat_thread_alive;
t->to_pid_to_str = linux_nat_pid_to_str;
t->to_has_thread_control = tc_schedlock;
t->to_thread_address_space = linux_nat_thread_address_space;
t->to_can_async_p = linux_nat_can_async_p;
t->to_is_async_p = linux_nat_is_async_p;