From c65b3e0d43b7b64febc4a1b7192e13f7be3a94fa Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Tue, 13 Sep 2011 19:27:01 +0000 Subject: [PATCH] 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. --- gdb/ChangeLog | 7 +++++++ gdb/inferior.h | 5 +++++ gdb/linux-thread-db.c | 34 ++++++++++++++++------------------ 3 files changed, 28 insertions(+), 18 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 7cec15e..fcb60b9 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,12 @@ 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 watchpoint to update not being in the breakpoint list yet. (hw_watchpoint_use_count): New, factored out from diff --git a/gdb/inferior.h b/gdb/inferior.h index cf747a6..0815b65 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 8141b20..8dd766b 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 */, -- 2.7.4