* remote.c (remote_notice_new_inferior): Use ptid_is_pid. Check

if the thread's ptid without a thread id field is in the list
	before calling thread_change_ptid.
	(extended_remote_attach_1): In non-stop mode, do not rely on
	querying the current thread, instead, query the thread list, and
	select the first thread of the process.
	* gdbthread.h (first_thread_of_process): Declare.
	* thread.c (first_thread_of_process): Define.
This commit is contained in:
Pedro Alves 2009-03-31 15:23:57 +00:00
parent e352511738
commit bad34192e5
4 changed files with 65 additions and 11 deletions

View File

@ -1,3 +1,14 @@
2009-03-31 Pedro Alves <pedro@codesourcery.com>
* remote.c (remote_notice_new_inferior): Use ptid_is_pid. Check
if the thread's ptid without a thread id field is in the list
before calling thread_change_ptid.
(extended_remote_attach_1): In non-stop mode, do not rely on
querying the current thread, instead, query the thread list, and
select the first thread of the process.
* gdbthread.h (first_thread_of_process): Declare.
* thread.c (first_thread_of_process): Define.
2009-03-30 Stan Shebs <stan@codesourcery.com> 2009-03-30 Stan Shebs <stan@codesourcery.com>
Make tracepoints into a type of breakpoint. Make tracepoints into a type of breakpoint.

View File

@ -229,6 +229,10 @@ extern struct thread_info *find_thread_pid (ptid_t ptid);
/* Find thread by GDB user-visible thread number. */ /* Find thread by GDB user-visible thread number. */
struct thread_info *find_thread_id (int num); struct thread_info *find_thread_id (int num);
/* Finds the first thread of the inferior given by PID. If PID is -1,
returns the first thread in the list. */
struct thread_info *first_thread_of_process (int pid);
/* Change the ptid of thread OLD_PTID to NEW_PTID. */ /* Change the ptid of thread OLD_PTID to NEW_PTID. */
void thread_change_ptid (ptid_t old_ptid, ptid_t new_ptid); void thread_change_ptid (ptid_t old_ptid, ptid_t new_ptid);

View File

@ -1228,15 +1228,23 @@ remote_notice_new_inferior (ptid_t currthread, int running)
if (!in_thread_list (currthread)) if (!in_thread_list (currthread))
{ {
struct inferior *inf = NULL; struct inferior *inf = NULL;
int pid = ptid_get_pid (currthread);
if (ptid_equal (pid_to_ptid (ptid_get_pid (currthread)), inferior_ptid)) if (ptid_is_pid (inferior_ptid)
&& pid == ptid_get_pid (inferior_ptid))
{ {
/* inferior_ptid has no thread member yet. This can happen /* inferior_ptid has no thread member yet. This can happen
with the vAttach -> remote_wait,"TAAthread:" path if the with the vAttach -> remote_wait,"TAAthread:" path if the
stub doesn't support qC. This is the first stop reported stub doesn't support qC. This is the first stop reported
after an attach, so this is the main thread. Update the after an attach, so this is the main thread. Update the
ptid in the thread list. */ ptid in the thread list. */
if (in_thread_list (pid_to_ptid (pid)))
thread_change_ptid (inferior_ptid, currthread); thread_change_ptid (inferior_ptid, currthread);
else
{
remote_add_thread (currthread, running);
inferior_ptid = currthread;
}
return; return;
} }
@ -3484,19 +3492,34 @@ extended_remote_attach_1 (struct target_ops *target, char *args, int from_tty)
error (_("Attaching to %s failed"), error (_("Attaching to %s failed"),
target_pid_to_str (pid_to_ptid (pid))); target_pid_to_str (pid_to_ptid (pid)));
remote_add_inferior (pid, 1);
inferior_ptid = pid_to_ptid (pid); inferior_ptid = pid_to_ptid (pid);
if (non_stop)
{
struct thread_info *thread;
/* Get list of threads. */
remote_threads_info (target);
thread = first_thread_of_process (pid);
if (thread)
inferior_ptid = thread->ptid;
else
inferior_ptid = pid_to_ptid (pid);
/* Invalidate our notion of the remote current thread. */
record_currthread (minus_one_ptid);
}
else
{
/* Now, if we have thread information, update inferior_ptid. */ /* Now, if we have thread information, update inferior_ptid. */
inferior_ptid = remote_current_thread (inferior_ptid); inferior_ptid = remote_current_thread (inferior_ptid);
remote_add_inferior (pid, 1);
if (non_stop)
/* Get list of threads. */
remote_threads_info (target);
else
/* Add the main thread to the thread list. */ /* Add the main thread to the thread list. */
add_thread_silent (inferior_ptid); add_thread_silent (inferior_ptid);
}
/* Next, if the target can specify a description, read it. We do /* Next, if the target can specify a description, read it. We do
this before anything involving memory or registers. */ this before anything involving memory or registers. */

View File

@ -401,6 +401,22 @@ in_thread_list (ptid_t ptid)
return 0; /* Never heard of 'im */ return 0; /* Never heard of 'im */
} }
/* Finds the first thread of the inferior given by PID. If PID is -1,
return the first thread in the list. */
struct thread_info *
first_thread_of_process (int pid)
{
struct thread_info *tp, *ret = NULL;
for (tp = thread_list; tp; tp = tp->next)
if (pid == -1 || ptid_get_pid (tp->ptid) == pid)
if (ret == NULL || tp->num < ret->num)
ret = tp;
return ret;
}
/* Print a list of thread ids currently known, and the total number of /* Print a list of thread ids currently known, and the total number of
threads. To be used from within catch_errors. */ threads. To be used from within catch_errors. */
static int static int