Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 23 Apr 2012 20:56:06 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r234616 - in head/sys: kern sys
Message-ID:  <201204232056.q3NKu6hU015276@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Mon Apr 23 20:56:05 2012
New Revision: 234616
URL: http://svn.freebsd.org/changeset/base/234616

Log:
  Allow for the process information sysctls to accept a thread id in addition
  to the process id.  It follows the ptrace(2) interface and allows debugging
  libraries to use thread ids directly, without slow and verbose conversion
  of thread id into pid.
  
  The PGET_NOTID flag is provided to allow a specific sysctl to disallow
  this behaviour.  All current callers of pget(9) have useful semantic to
  operate on tid and do not need this flag.
  
  Reviewed by:	jhb, trocini
  MFC after:	1 week

Modified:
  head/sys/kern/kern_proc.c
  head/sys/sys/proc.h

Modified: head/sys/kern/kern_proc.c
==============================================================================
--- head/sys/kern/kern_proc.c	Mon Apr 23 20:53:50 2012	(r234615)
+++ head/sys/kern/kern_proc.c	Mon Apr 23 20:56:05 2012	(r234616)
@@ -309,6 +309,30 @@ pfind(pid)
 	return (p);
 }
 
+static struct proc *
+pfind_tid(pid_t tid)
+{
+	struct proc *p;
+	struct thread *td;
+
+	sx_slock(&allproc_lock);
+	FOREACH_PROC_IN_SYSTEM(p) {
+		PROC_LOCK(p);
+		if (p->p_state == PRS_NEW) {
+			PROC_UNLOCK(p);
+			continue;
+		}
+		FOREACH_THREAD_IN_PROC(p, td) {
+			if (td->td_tid == tid)
+				goto found;
+		}
+		PROC_UNLOCK(p);
+	}
+found:
+	sx_sunlock(&allproc_lock);
+	return (p);
+}
+
 /*
  * Locate a process group by number.
  * The caller must hold proctree_lock.
@@ -339,7 +363,12 @@ pget(pid_t pid, int flags, struct proc *
 	struct proc *p;
 	int error;
 
-	p = pfind(pid);
+	if (pid <= PID_MAX)
+		p = pfind(pid);
+	else if ((flags & PGET_NOTID) == 0)
+		p = pfind_tid(pid);
+	else
+		p = NULL;
 	if (p == NULL)
 		return (ESRCH);
 	if ((flags & PGET_CANSEE) != 0) {

Modified: head/sys/sys/proc.h
==============================================================================
--- head/sys/sys/proc.h	Mon Apr 23 20:53:50 2012	(r234615)
+++ head/sys/sys/proc.h	Mon Apr 23 20:56:05 2012	(r234616)
@@ -840,6 +840,7 @@ struct	proc *zpfind(pid_t);		/* Find zom
 #define	PGET_ISCURRENT	0x00008	/* Check that the found process is current. */
 #define	PGET_NOTWEXIT	0x00010	/* Check that the process is not in P_WEXIT. */
 #define	PGET_NOTINEXEC	0x00020	/* Check that the process is not in P_INEXEC. */
+#define	PGET_NOTID	0x00040	/* Do not assume tid if pid > PID_MAX. */
 
 #define	PGET_WANTREAD	(PGET_HOLD | PGET_CANDEBUG | PGET_NOTWEXIT)
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201204232056.q3NKu6hU015276>