Skip site navigation (1)Skip section navigation (2)
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>