From bad34192e56554fda247b1d0c72cfb18bc7f83bf Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Tue, 31 Mar 2009 15:23:57 +0000 Subject: [PATCH] * 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. --- gdb/ChangeLog | 11 +++++++++++ gdb/gdbthread.h | 4 ++++ gdb/remote.c | 43 +++++++++++++++++++++++++++++++++---------- gdb/thread.c | 16 ++++++++++++++++ 4 files changed, 64 insertions(+), 10 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 387e446752c..f6c6bd2cc77 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,14 @@ +2009-03-31 Pedro Alves + + * 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 Make tracepoints into a type of breakpoint. diff --git a/gdb/gdbthread.h b/gdb/gdbthread.h index 5b4bce57661..1833a9e729d 100644 --- a/gdb/gdbthread.h +++ b/gdb/gdbthread.h @@ -229,6 +229,10 @@ extern struct thread_info *find_thread_pid (ptid_t ptid); /* Find thread by GDB user-visible thread number. */ 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. */ void thread_change_ptid (ptid_t old_ptid, ptid_t new_ptid); diff --git a/gdb/remote.c b/gdb/remote.c index 4173aaa54d2..e27ad776423 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. */ diff --git a/gdb/thread.c b/gdb/thread.c index a1617f2390b..0ce24c64a9e 100644 --- a/gdb/thread.c +++ b/gdb/thread.c @@ -401,6 +401,22 @@ in_thread_list (ptid_t ptid) 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 threads. To be used from within catch_errors. */ static int -- 2.30.2