aboutsummaryrefslogtreecommitdiff
path: root/gdb/remote.c
diff options
context:
space:
mode:
authorPedro Alves <palves@redhat.com>2009-03-31 15:23:57 +0000
committerPedro Alves <palves@redhat.com>2009-03-31 15:23:57 +0000
commitbad34192e56554fda247b1d0c72cfb18bc7f83bf (patch)
tree3c2b2028af0f036a6eb8b122435dd206baa0cac3 /gdb/remote.c
parente35251173842f4f5f2b4ef0337a16b14793f48e2 (diff)
downloadgdb-bad34192e56554fda247b1d0c72cfb18bc7f83bf.zip
gdb-bad34192e56554fda247b1d0c72cfb18bc7f83bf.tar.gz
gdb-bad34192e56554fda247b1d0c72cfb18bc7f83bf.tar.bz2
* 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.
Diffstat (limited to 'gdb/remote.c')
-rw-r--r--gdb/remote.c43
1 files changed, 33 insertions, 10 deletions
diff --git a/gdb/remote.c b/gdb/remote.c
index 4173aaa..e27ad77 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -1228,15 +1228,23 @@ remote_notice_new_inferior (ptid_t currthread, int running)
if (!in_thread_list (currthread))
{
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
with the vAttach -> remote_wait,"TAAthread:" path if the
stub doesn't support qC. This is the first stop reported
after an attach, so this is the main thread. Update the
ptid in the thread list. */
- thread_change_ptid (inferior_ptid, currthread);
+ if (in_thread_list (pid_to_ptid (pid)))
+ thread_change_ptid (inferior_ptid, currthread);
+ else
+ {
+ remote_add_thread (currthread, running);
+ inferior_ptid = currthread;
+ }
return;
}
@@ -3484,19 +3492,34 @@ extended_remote_attach_1 (struct target_ops *target, char *args, int from_tty)
error (_("Attaching to %s failed"),
target_pid_to_str (pid_to_ptid (pid)));
+ remote_add_inferior (pid, 1);
+
inferior_ptid = pid_to_ptid (pid);
- /* Now, if we have thread information, update inferior_ptid. */
- inferior_ptid = remote_current_thread (inferior_ptid);
+ if (non_stop)
+ {
+ struct thread_info *thread;
- remote_add_inferior (pid, 1);
+ /* Get list of threads. */
+ remote_threads_info (target);
- if (non_stop)
- /* 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
- /* Add the main thread to the thread list. */
- add_thread_silent (inferior_ptid);
+ {
+ /* Now, if we have thread information, update inferior_ptid. */
+ inferior_ptid = remote_current_thread (inferior_ptid);
+
+ /* Add the main thread to the thread list. */
+ add_thread_silent (inferior_ptid);
+ }
/* Next, if the target can specify a description, read it. We do
this before anything involving memory or registers. */