On 2012/4/24 4:56, Konstantin Belousov wrote:
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);
+}
+

There is a tdfind(tid, pid) function which is faster in kern_thread.c,
is it not good enough or is there any problem I don't see ? :(



  /*
   * 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)

_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"


_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to