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:
John Baldwin 2017-04-18 09:44:32 -07:00
parent 6631d36456
commit d56060f08a
2 changed files with 34 additions and 34 deletions

View File

@ -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.

View File

@ -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);