Move fbsd_resume and related functions below fork following helper code.
gdb/ChangeLog: * fbsd-nat.c (super_resume): Move earlier next to "super_wait". (resume_one_thread_cb): Move below fork following helper code. (resume_all_threads_cb): Likewise. (fbsd_resume): Likewise.
This commit is contained in:
parent
bb2a62e694
commit
8607ea632c
|
@ -1,3 +1,10 @@
|
||||||
|
2016-07-01 John Baldwin <jhb@FreeBSD.org>
|
||||||
|
|
||||||
|
* fbsd-nat.c (super_resume): Move earlier next to "super_wait".
|
||||||
|
(resume_one_thread_cb): Move below fork following helper code.
|
||||||
|
(resume_all_threads_cb): Likewise.
|
||||||
|
(fbsd_resume): Likewise.
|
||||||
|
|
||||||
2016-07-01 John Baldwin <jhb@FreeBSD.org>
|
2016-07-01 John Baldwin <jhb@FreeBSD.org>
|
||||||
|
|
||||||
* fbsd-nat.c (fbsd_follow_fork): Only detach child if
|
* fbsd-nat.c (fbsd_follow_fork): Only detach child if
|
||||||
|
|
127
gdb/fbsd-nat.c
127
gdb/fbsd-nat.c
|
@ -281,6 +281,10 @@ fbsd_xfer_partial (struct target_ops *ops, enum target_object object,
|
||||||
#ifdef PT_LWPINFO
|
#ifdef PT_LWPINFO
|
||||||
static int debug_fbsd_lwp;
|
static int debug_fbsd_lwp;
|
||||||
|
|
||||||
|
static void (*super_resume) (struct target_ops *,
|
||||||
|
ptid_t,
|
||||||
|
int,
|
||||||
|
enum gdb_signal);
|
||||||
static ptid_t (*super_wait) (struct target_ops *,
|
static ptid_t (*super_wait) (struct target_ops *,
|
||||||
ptid_t,
|
ptid_t,
|
||||||
struct target_waitstatus *,
|
struct target_waitstatus *,
|
||||||
|
@ -492,70 +496,6 @@ fbsd_update_thread_list (struct target_ops *ops)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void (*super_resume) (struct target_ops *,
|
|
||||||
ptid_t,
|
|
||||||
int,
|
|
||||||
enum gdb_signal);
|
|
||||||
|
|
||||||
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
|
|
||||||
fbsd_resume (struct target_ops *ops,
|
|
||||||
ptid_t ptid, int step, enum gdb_signal signo)
|
|
||||||
{
|
|
||||||
|
|
||||||
if (debug_fbsd_lwp)
|
|
||||||
fprintf_unfiltered (gdb_stdlog,
|
|
||||||
"FLWP: fbsd_resume for ptid (%d, %ld, %ld)\n",
|
|
||||||
ptid_get_pid (ptid), ptid_get_lwp (ptid),
|
|
||||||
ptid_get_tid (ptid));
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
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);
|
|
||||||
ptid = inferior_ptid;
|
|
||||||
}
|
|
||||||
super_resume (ops, ptid, step, signo);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef TDP_RFPPWAIT
|
#ifdef TDP_RFPPWAIT
|
||||||
/*
|
/*
|
||||||
To catch fork events, PT_FOLLOW_FORK is set on every traced process
|
To catch fork events, PT_FOLLOW_FORK is set on every traced process
|
||||||
|
@ -638,6 +578,65 @@ fbsd_is_child_pending (pid_t pid)
|
||||||
}
|
}
|
||||||
#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
|
||||||
|
fbsd_resume (struct target_ops *ops,
|
||||||
|
ptid_t ptid, int step, enum gdb_signal signo)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (debug_fbsd_lwp)
|
||||||
|
fprintf_unfiltered (gdb_stdlog,
|
||||||
|
"FLWP: fbsd_resume for ptid (%d, %ld, %ld)\n",
|
||||||
|
ptid_get_pid (ptid), ptid_get_lwp (ptid),
|
||||||
|
ptid_get_tid (ptid));
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
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);
|
||||||
|
ptid = inferior_ptid;
|
||||||
|
}
|
||||||
|
super_resume (ops, ptid, step, signo);
|
||||||
|
}
|
||||||
|
|
||||||
/* Wait for the child specified by PTID to do something. Return the
|
/* Wait for the child specified by PTID to do something. Return the
|
||||||
process ID of the child, or MINUS_ONE_PTID in case of error; store
|
process ID of the child, or MINUS_ONE_PTID in case of error; store
|
||||||
the status in *OURSTATUS. */
|
the status in *OURSTATUS. */
|
||||||
|
|
Loading…
Reference in New Issue