diff options
author | John Baldwin <jhb@FreeBSD.org> | 2017-04-18 09:44:32 -0700 |
---|---|---|
committer | John Baldwin <jhb@FreeBSD.org> | 2017-04-18 09:45:37 -0700 |
commit | d56060f08aa4ed5786042a066f62aa8e474cc0fd (patch) | |
tree | 2d036924cef0fdcea961b5ae6a870c2cb9fbc57b /gdb/fbsd-nat.c | |
parent | 6631d36456babbaf4c78b955165c3344f95ac5dd (diff) | |
download | gdb-d56060f08aa4ed5786042a066f62aa8e474cc0fd.zip gdb-d56060f08aa4ed5786042a066f62aa8e474cc0fd.tar.gz gdb-d56060f08aa4ed5786042a066f62aa8e474cc0fd.tar.bz2 |
PR threads/20743: Don't attempt to suspend or resume exited threads.
When resuming a native FreeBSD process, ignore exited threads when
suspending/resuming individual threads prior to continuing the process.
gdb/ChangeLog:
PR threads/20743
* fbsd-nat.c (resume_one_thread_cb): Remove.
(resume_all_threads_cb): Remove.
(fbsd_resume): Use ALL_NON_EXITED_THREADS instead of
iterate_over_threads.
Diffstat (limited to 'gdb/fbsd-nat.c')
-rw-r--r-- | gdb/fbsd-nat.c | 60 |
1 files changed, 26 insertions, 34 deletions
diff --git a/gdb/fbsd-nat.c b/gdb/fbsd-nat.c index 5c4408b..ef5ad1e 100644 --- a/gdb/fbsd-nat.c +++ b/gdb/fbsd-nat.c @@ -653,38 +653,6 @@ fbsd_next_vfork_done (void) #endif #endif -static int -resume_one_thread_cb (struct thread_info *tp, void *data) -{ - ptid_t *ptid = (ptid_t *) data; - int request; - - if (ptid_get_pid (tp->ptid) != ptid_get_pid (*ptid)) - return 0; - - if (ptid_get_lwp (tp->ptid) == ptid_get_lwp (*ptid)) - request = PT_RESUME; - else - request = PT_SUSPEND; - - if (ptrace (request, ptid_get_lwp (tp->ptid), NULL, 0) == -1) - perror_with_name (("ptrace")); - return 0; -} - -static int -resume_all_threads_cb (struct thread_info *tp, void *data) -{ - ptid_t *filter = (ptid_t *) data; - - if (!ptid_match (tp->ptid, *filter)) - return 0; - - if (ptrace (PT_RESUME, ptid_get_lwp (tp->ptid), NULL, 0) == -1) - perror_with_name (("ptrace")); - return 0; -} - /* Implement the "to_resume" target_ops method. */ static void @@ -711,13 +679,37 @@ fbsd_resume (struct target_ops *ops, if (ptid_lwp_p (ptid)) { /* If ptid is a specific LWP, suspend all other LWPs in the process. */ - iterate_over_threads (resume_one_thread_cb, &ptid); + struct thread_info *tp; + int request; + + ALL_NON_EXITED_THREADS (tp) + { + if (ptid_get_pid (tp->ptid) != ptid_get_pid (ptid)) + continue; + + if (ptid_get_lwp (tp->ptid) == ptid_get_lwp (ptid)) + request = PT_RESUME; + else + request = PT_SUSPEND; + + if (ptrace (request, ptid_get_lwp (tp->ptid), NULL, 0) == -1) + perror_with_name (("ptrace")); + } } else { /* If ptid is a wildcard, resume all matching threads (they won't run until the process is continued however). */ - iterate_over_threads (resume_all_threads_cb, &ptid); + struct thread_info *tp; + + ALL_NON_EXITED_THREADS (tp) + { + if (!ptid_match (tp->ptid, ptid)) + continue; + + if (ptrace (PT_RESUME, ptid_get_lwp (tp->ptid), NULL, 0) == -1) + perror_with_name (("ptrace")); + } ptid = inferior_ptid; } super_resume (ops, ptid, step, signo); |