Date: Mon, 12 Jul 2004 14:29:47 GMT From: David Xu <davidxu@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 57179 for review Message-ID: <200407121429.i6CETlsw019383@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=57179 Change 57179 by davidxu@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 */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200407121429.i6CETlsw019383>