From: Pedro Alves Date: Tue, 13 Sep 2011 19:27:01 +0000 (+0000) Subject: 2011-09-13 Pedro Alves X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=c65b3e0d43b7b64febc4a1b7192e13f7be3a94fa;p=binutils-gdb.git 2011-09-13 Pedro Alves * inferior.h (ALL_INFERIORS): New. * linux-thread-db.c (thread_db_find_new_threads_2): Remove check for a stopped thread. (thread_db_find_new_threads): Look for threads in all inferiors. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 7cec15e4f93..fcb60b9ae2b 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2011-09-13 Pedro Alves + + * inferior.h (ALL_INFERIORS): New. + * linux-thread-db.c (thread_db_find_new_threads_2): Remove check + for a stopped thread. + (thread_db_find_new_threads): Look for threads in all inferiors. + 2011-09-13 Pedro Alves * breakpoint.c (update_watchpoint): Handle the case of the diff --git a/gdb/inferior.h b/gdb/inferior.h index cf747a650cd..0815b65e9e1 100644 --- a/gdb/inferior.h +++ b/gdb/inferior.h @@ -615,6 +615,11 @@ extern void set_current_inferior (struct inferior *); extern struct cleanup *save_current_inferior (void); +/* Traverse all inferiors. */ + +#define ALL_INFERIORS(I) \ + for ((I) = inferior_list; (I); (I) = (I)->next) + extern struct inferior *inferior_list; /* Prune away automatically added inferiors that aren't required diff --git a/gdb/linux-thread-db.c b/gdb/linux-thread-db.c index 8141b203b2a..8dd766b2512 100644 --- a/gdb/linux-thread-db.c +++ b/gdb/linux-thread-db.c @@ -1552,20 +1552,6 @@ thread_db_find_new_threads_2 (ptid_t ptid, int until_no_new) int pid = ptid_get_pid (ptid); int i, loop; - if (target_has_execution) - { - struct lwp_info *lp; - - /* In linux, we can only read memory through a stopped lwp. */ - ALL_LWPS (lp, ptid) - if (lp->stopped && ptid_get_pid (lp->ptid) == pid) - break; - - if (!lp) - /* There is no stopped thread. Bail out. */ - return; - } - info = get_thread_db_info (GET_PID (ptid)); /* Access an lwp we know is stopped. */ @@ -1607,13 +1593,25 @@ static void thread_db_find_new_threads (struct target_ops *ops) { struct thread_db_info *info; + struct inferior *inf; - info = get_thread_db_info (GET_PID (inferior_ptid)); + ALL_INFERIORS (inf) + { + struct thread_info *thread; - if (info == NULL) - return; + if (inf->pid == 0) + continue; - thread_db_find_new_threads_1 (inferior_ptid); + info = get_thread_db_info (inf->pid); + if (info == NULL) + continue; + + thread = any_live_thread_of_process (inf->pid); + if (thread == NULL || thread->executing) + continue; + + thread_db_find_new_threads_1 (thread->ptid); + } if (target_has_execution) iterate_over_lwps (minus_one_ptid /* iterate over all */,