PERFORCE change 57179 for review
David Xu
davidxu at FreeBSD.org
Mon Jul 12 07:29:48 PDT 2004
http://perforce.freebsd.org/chv.cgi?CH=57179
Change 57179 by davidxu at davidxu_alona on 2004/07/12 14:28:57
Following macrel's PT_LWPINFO commit. I changed p_xlwpid to p_xthread,
because a pointer is better than an id, with pointer, you can access
its data without further searching.
Affected files ...
.. //depot/projects/davidxu_ksedbg/src/gnu/usr.bin/gdb/libgdb/fbsd-threads.c#11 edit
.. //depot/projects/davidxu_ksedbg/src/sys/kern/kern_exit.c#3 edit
.. //depot/projects/davidxu_ksedbg/src/sys/kern/kern_sig.c#9 edit
.. //depot/projects/davidxu_ksedbg/src/sys/kern/sys_process.c#11 edit
.. //depot/projects/davidxu_ksedbg/src/sys/sys/proc.h#7 edit
.. //depot/projects/davidxu_ksedbg/src/sys/sys/ptrace.h#6 edit
Differences ...
==== //depot/projects/davidxu_ksedbg/src/gnu/usr.bin/gdb/libgdb/fbsd-threads.c#11 (text+ko) ====
@@ -233,12 +233,12 @@
static long
get_current_lwp (int pid)
{
- lwpid_t lwp;
+ struct ptrace_lwpinfo pl;
- if (ptrace (PT_GETXTHREAD, GET_PID(inferior_ptid), (caddr_t)&lwp, 0))
- perror_with_name("PT_GETXTHREAD");
+ if (ptrace (PT_LWPINFO, pid, (caddr_t)&pl, sizeof(pl)))
+ perror_with_name("PT_LWPINFO");
- return (long)lwp;
+ return (long)pl.pl_lwpid;
}
static void
@@ -485,14 +485,13 @@
fbsd_thread_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
{
ptid_t ret;
- lwpid_t lwp;
+ long lwp;
CORE_ADDR stop_pc;
ret = child_ops.to_wait (ptid, ourstatus);
if (GET_PID(ret) >= 0 && ourstatus->kind == TARGET_WAITKIND_STOPPED)
{
- if (ptrace (PT_GETXTHREAD, GET_PID(ret), (caddr_t)&lwp, 0))
- perror_with_name ("ptrace cannot get current lwp");
+ lwp = get_current_lwp (proc_handle.pid);
ret = thread_from_lwp (BUILD_LWP (lwp, GET_PID (ret)));
if (!in_thread_list (ret))
add_thread (ret);
==== //depot/projects/davidxu_ksedbg/src/sys/kern/kern_exit.c#3 (text+ko) ====
@@ -429,7 +429,7 @@
mtx_lock(&Giant);
PROC_LOCK(p);
p->p_xstat = rv;
- p->p_xlwpid = td->td_tid;
+ p->p_xthread = td;
*p->p_ru = p->p_stats->p_ru;
mtx_lock_spin(&sched_lock);
calcru(p, &p->p_ru->ru_utime, &p->p_ru->ru_stime, NULL);
==== //depot/projects/davidxu_ksedbg/src/sys/kern/kern_sig.c#9 (text+ko) ====
@@ -1881,7 +1881,7 @@
goto out;
p->p_flag |= P_STOPPED_SIG;
p->p_xstat = sig;
- p->p_xlwpid = td->td_tid;
+ p->p_xthread = td;
mtx_lock_spin(&sched_lock);
FOREACH_THREAD_IN_PROC(p, td0) {
if (TD_IS_SLEEPING(td0) &&
@@ -2194,7 +2194,7 @@
&p->p_mtx.mtx_object, "Catching SIGSTOP");
p->p_flag |= P_STOPPED_SIG;
p->p_xstat = sig;
- p->p_xlwpid = td->td_tid;
+ p->p_xthread = td;
mtx_lock_spin(&sched_lock);
FOREACH_THREAD_IN_PROC(p, td0) {
if (TD_IS_SLEEPING(td0) &&
==== //depot/projects/davidxu_ksedbg/src/sys/kern/sys_process.c#11 (text+ko) ====
@@ -376,7 +376,7 @@
struct ptrace_lwpinfo *pl;
int error, write, tmp, num;
int proctree_locked = 0;
- lwpid_t tid = 0, tid2, *buf;
+ lwpid_t tid = 0, *buf;
pid_t saved_pid = pid;
curp = td->td_proc;
@@ -657,21 +657,16 @@
/* deliver or queue signal */
if (P_SHOULDSTOP(p)) {
p->p_xstat = data;
- p->p_xlwpid = 0;
p->p_flag &= ~(P_STOPPED_TRACE|P_STOPPED_SIG);
mtx_lock_spin(&sched_lock);
- if (req == PT_DETACH || saved_pid <= PID_MAX) {
- if (p->p_xthread) {
- p->p_xthread->td_flags &= ~TDF_XSIG;
- p->p_xthread->td_xsig = data;
- p->p_xthread = NULL;
- }
+ if (saved_pid <= PID_MAX) {
+ p->p_xthread->td_flags &= ~TDF_XSIG;
+ p->p_xthread->td_xsig = data;
} else {
td2->td_flags &= ~TDF_XSIG;
td2->td_xsig = data;
- if (p->p_xthread == td2)
- p->p_xthread = NULL;
}
+ p->p_xthread = NULL;
if (req == PT_DETACH) {
struct thread *td3;
FOREACH_THREAD_IN_PROC(p, td3)
@@ -806,27 +801,26 @@
return (EINVAL);
pl = addr;
_PHOLD(p);
- pl->pl_lwpid = p->p_xlwpid;
+ if (saved_pid <= PID_MAX) {
+ pl->pl_lwpid = p->p_xthread->td_tid;
+ pl->pl_event = PL_EVENT_SIGNAL;
+ } else {
+ pl->pl_lwpid = td2->td_tid;
+ if (td2->td_flags & TDF_XSIG)
+ pl->pl_event = PL_EVENT_SIGNAL;
+ else
+ pl->pl_event = 0;
+ }
_PRELE(p);
PROC_UNLOCK(p);
- pl->pl_event = PL_EVENT_SIGNAL;
return (0);
- case PT_GETNUMTHRS:
+ case PT_GETNUMLWPS:
td->td_retval[0] = p->p_numthreads;
PROC_UNLOCK(p);
return (0);
- case PT_GETXTHREAD: /* Get trigger thread */
- if (p->p_xthread)
- tid2 = p->p_xthread->td_tid;
- else
- tid2 = td2->td_tid;
- PROC_UNLOCK(p);
- error = copyout(&tid2, addr, sizeof(lwpid_t));
- return (error);
-
- case PT_GETTHRLIST:
+ case PT_GETLWPLIST:
if (data <= 0) {
PROC_UNLOCK(p);
return (EINVAL);
@@ -887,7 +881,7 @@
p->p_step = 1;
do {
p->p_xstat = val;
- p->p_xlwpid = 0;
+ p->p_xthread = NULL;
p->p_stype = event; /* Which event caused the stop? */
wakeup(&p->p_stype); /* Wake up any PIOCWAIT'ing procs */
msleep(&p->p_step, &p->p_mtx, PWAIT, "stopevent", 0);
==== //depot/projects/davidxu_ksedbg/src/sys/sys/proc.h#7 (text+ko) ====
@@ -605,7 +605,6 @@
#define p_endcopy p_xstat
u_short p_xstat; /* (c) Exit status; also stop sig. */
- lwpid_t p_xlwpid; /* (c) Thread corresponding p_xstat. */
int p_numthreads; /* (j) Number of threads. */
int p_numksegrps; /* (?) number of ksegrps */
struct mdproc p_md; /* Any machine-dependent fields. */
==== //depot/projects/davidxu_ksedbg/src/sys/sys/ptrace.h#6 (text+ko) ====
@@ -48,6 +48,12 @@
#define PT_DETACH 11 /* stop tracing a process */
#define PT_IO 12 /* do I/O to/from stopped process. */
#define PT_LWPINFO 13 /* Info about the LWP that stopped. */
+#define PT_GETNUMLWPS 14 /* get total number of threads */
+#define PT_GETLWPLIST 15 /* get thread list */
+#define PT_CLEARSTEP 16 /* turn off single step */
+#define PT_SETSTEP 17 /* turn on single step */
+#define PT_SUSPEND 18 /* suspend a thread */
+#define PT_RESUME 19 /* resume a thread */
#define PT_TO_SCE 20
#define PT_TO_SCX 21
@@ -59,13 +65,6 @@
#define PT_SETFPREGS 36 /* set floating-point registers */
#define PT_GETDBREGS 37 /* get debugging registers */
#define PT_SETDBREGS 38 /* set debugging registers */
-#define PT_GETNUMTHRS 39 /* get total number of threads */
-#define PT_GETXTHREAD 40 /* get signal trigger thread */
-#define PT_GETTHRLIST 41 /* get thread list */
-#define PT_CLEARSTEP 42 /* turn off single step */
-#define PT_SETSTEP 43 /* turn on single step */
-#define PT_SUSPEND 44 /* suspend a thread */
-#define PT_RESUME 45 /* resume a thread */
#define PT_FIRSTMACH 64 /* for machine-specific requests */
#include <machine/ptrace.h> /* machine-specific requests, if any */
More information about the p4-projects
mailing list