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.
This commit is contained in:
parent
6631d36456
commit
d56060f08a
|
@ -1,3 +1,11 @@
|
|||
2017-04-18 John Baldwin <jhb@FreeBSD.org>
|
||||
|
||||
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.
|
||||
|
||||
2017-04-17 Joel Brobecker <brobecker@adacore.com>
|
||||
|
||||
* NEWS: Create a new section for the next release branch.
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue